计算字符串的自定义长度、自定义进制随机均匀短散列值

news/2024/9/18 1:26:57/ 标签: 哈希算法, 算法, php

要生成自定义长度、自定义进制的随机均匀短散列值,可以结合哈希函数和进制转换来实现。哈希函数可以将字符串映射为固定长度的二进制值,然后根据自定义的进制进行编码,生成你需要的短散列值。我们可以使用 PHP 来实现该功能,以下是具体的步骤:

实现步骤

  1. 输入字符串的哈希值:使用常见的算法>哈希算法如 MD5 或 SHA-256 生成散列值。
  2. 转换哈希值为数字:将生成的哈希值转换为数字表示。
  3. 根据自定义进制转换:将数字转换为你想要的进制(例如 62 进制,包含数字、大小写字母)。
  4. 控制散列长度:生成的散列值可以根据需求来截断或补齐为特定长度。

代码实现

下面是使用 PHP 实现该逻辑的代码示例:

php">/*** 生成自定义长度的自定义进制随机均匀短散列值** @param string $inputStr   需要计算的字符串* @param int    $len        指定散列值字符长度(可取1~32位),默认32位(2:显示0~1;4:显示0~3;8:显示0~7;10:显示0~9;16:显示0~F;32:显示0~V;64:显示0~/)...")* @param int    $base       自定义的进制,默认16进制* @return string*/
public static function generateCustomShortHash($inputStr, $len=32, $base=16, $prefix='', $suffix='',$times=0){$md5 = strtoupper(md5($prefix.$inputStr.$suffix));$base_str = array ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y' );//去除了I、L、O、Z四字母,(I、i、L、l与数字1相似,O、o与数字0相似,Z、z与数字2相似,1~F属于16进制常规范筹不宜删减);$b_one = ceil(log($base,2));//每一位字符需要2进制字符长度$h_one = ceil($b_one/4);//每一位字符需要16进制字符长度$m_len = $b_one % 4;//非4的整数倍时高位丢弃,计算丢弃的位数if(ceil(($b_one * $len) / 4) > strlen($md5)){//需要总16进制字符长度超过最大字符长度return false;}for ($run_num=0; $run_num < 100; $run_num++) { $hex = isset($hex)?strtoupper(md5($hex)):$md5;$strabbr = '';for ($i = 0; $i < $len; $i++) {//循环每一位目标字符生成工作$subHex = substr($hex, $i*$h_one, $h_one);//按目标字符所需16进制字符长度进行截取$b1_str = ($h_one - 1) * 4 + ($m_len?:4);//生成二进制位运算的1字符数$b0_str = $m_len?(4-$m_len):0;//生成二进制位运算的0字符数$b_str = $m_len?str_repeat('0',$b0_str).str_repeat('1',$b1_str):str_repeat('1',$b1_str);//拼接二进制位运算的字符串$int = (bindec('0b'.$b_str)) & (hexdec('0x'.$subHex));//按位与保留有效位值$strabbr .= $base_str[$int];//从数组中获取对应字符}//存表逻辑if(Urlabbr::selectcount(['strabbr'=>$strabbr])==0){$urlabbr_data = ['str'=>$inputStrc,'strmd5'=>md5($inputStr),'strabbr'=>$strabbr,'run_num'=>$run_num+1,'views'=>0,'createtime'=>$times?:time(),'updatetime'=>$times?:time(),'switch'=>1,];Urlabbr::addid($urlabbr_data);break;}}if($run_num >= 100){ //撞库次数超过100return false;}//返回数据return $strabbr;}

代码说明

  1. 字符表定义:我们使用 0123456789ABCDEFGHJKMNPQRSTUVWXY 作为 32 进制字符表,去除了I、L、O、Z四字母,(I、i、L、l与数字1相似,O、o与数字0相似,Z、z与数字2相似,1~F属于16进制常规范筹不宜删减);

  2. 哈希计算:我们使用 hash('sha256', $inputStr) 来计算输入字符串的 SHA-256 哈希值。由于 SHA-256 生成 64 位的十六进制数(256 位),我们可以选取前 15 位哈希值转成十进制,以确保数值足够大且不会溢出。

  3. 进制转换:将哈希值的十进制数字逐位转为 32 进制,通过 num % $base 计算余数,从而获得 32 进制字符,并将字符拼接到结果中。

  4. 结果处理:使用 str_pad() 来确保最终生成的短散列值具有指定的长度,不足的部分以 0 补齐。

运行结果

对于输入字符串 "example_string",生成了一个 8 位长度的 32 进制短散列值。

扩展

  • 更大进制:如果需要更高的进制,可以扩展字符集。例如支持 95 个可打印字符(ASCII)。
  • 随机性增强:可以在哈希值基础上添加时间戳、随机数等增强散列的随机性。
  • 更长哈希:使用不同的算法>哈希算法或截取更多位数,可以增加散列的多样性。

http://www.ppmy.cn/news/1524250.html

相关文章

turtle.circle() 函数绘制弧形规律助记图 ← Python

【Python 之 turtle.circle() 函数定义】 定义&#xff1a;turtle.circle(radius, extent)作用&#xff1a;根据半径 radius 绘制 extent 角度的弧形参数&#xff1a;radius &#xff1a;弧形半径当 radius 值为正数时&#xff0c;圆心在当前位置/小海龟左侧。当 radius 值为负…

神经网络通俗理解学习笔记(1)

神经网络通俗理解学习笔记&#xff08;1&#xff09; 神经网络原理激活函数前向传播和反向传播多层感知机代码实现加载数据网络结构损失函数优化器训练测试保存 回归问题一元线性回归多元线性回归多项式回归 线性回归代码实现数据生成设置超参数初始化参数可视化Pytorch模型实现…

22_图论中的高级数据结构

菜鸟&#xff1a;老鸟&#xff0c;我最近在处理一个网络节点数据的问题&#xff0c;发现代码运行得特别慢。你能帮我看看有什么优化的方法吗&#xff1f; 老鸟&#xff1a;当然可以。你处理的是图结构对吗&#xff1f;你是如何存储和操作这些节点的&#xff1f; 菜鸟&#xf…

LTE PSS搜索阶段频偏估计MATLAB实现

上期讲到PSS阶段频偏估计,包括整数倍频偏估计和小数倍频偏估计,但是未用MATLAB给大家实现,本期用MATLAB实现: function [freq_offet,N_ID_2,frameHead] = PSS_det(rxSig_init,params) % % % % coding time 2024.09.11 pssThr = 25; N = 128; root_set = [25 29 34]; …

服务器数据恢复—OneFS文件系统下数据被删除的数据恢复案例

服务器数据恢复环境&故障&#xff1a; EMC NAS&#xff08;Isilon S200&#xff09;&#xff0c;共3个节点&#xff0c;每个节点配置12块STAT硬盘。数据分两部分&#xff1a;一部分数据为vmware虚拟机&#xff08;WEB服务器&#xff09;&#xff0c;通过NFS协议共享到ESX主…

Origin画图——误差棒的制作

1.示例数据如下&#xff0c;x轴数据可以是自己的溶液浓度&#xff0c;不同模型等&#xff0c;y轴数据由自己的具体数据而定。 2.选中三列数据&#xff0c;选择统计&#xff0c;描述统计&#xff0c;行统计&#xff0c;选择输出量&#xff0c;标准差与均值。 3.输出数据如下。…

什么是嵌入式?行业前景如何?

目录 什么是嵌入式&#xff1f; 主要特点 常见应用场景 1. 工业自动化 2. 交通运输 3. 智能家居 4. 消费电子 5. 医疗设备 6. 航空航天 7. 物联网&#xff08;IoT&#xff09; 8. 能源管理 行业前景如何&#xff1f; 市场需求强劲 物联网&#xff08;IoT&#xff09;的爆发 汽车…

数据集火焰检测 >> DataBall

数据集 火焰检测 目标检测 深度学习 人工智能 ---------------------------------------------------------- 火焰检测数据集&#xff1a;2000 样本

每天一道面试题(4):Spring Boot 的“约定优于配置”理解

Spring Boot 的“约定优于配置”理解 普通人的回答 在 Spring Boot 中&#xff0c;"约定优于配置"的理念可以减少大量的配置工作&#xff0c;让开发者专注于业务代码的编写。这意味着 Spring Boot 默认提供了许多开箱即用的配置和功能&#xff0c;使得我们不需要手…

为虚拟机配置固定的IP地址(CentOS9)

配置虚拟网卡 首先关闭虚拟机 打开虚拟网络编辑器 选择更改配置 选择VMnet8&#xff0c;选择子网的IP和掩码 &#xff08;这里的子网掩码为255.255.255.0&#xff0c;表示前24位为网络号&#xff0c;后8位为主机号&#xff09;然后点击DHCP设置 设置开始IP地址和结束IP地址&…

论文120:Giga-SSL: Self-supervised learning for gigapixel images (2023, CVPR, 开源)

文章目录 1 要点2 方法2.1 算法设计2.2 设计选择 1 要点 题目&#xff1a;用于千兆像素图像的自监督学习 (Giga-SSL: Self-Supervised Learning for Gigapixel Images) 代码&#xff1a;https://github.com/trislaz/gigassl 研究目的&#xff1a; 现有的WSI分类方法依赖于有…

win10任务栏透明如何调整?——详解Windows任务栏设置与优化技巧

在这个数字化时代&#xff0c;电脑已经成为我们日常办公和生活中的。关于win10任务栏透明的设置方法&#xff0c;身边很多同事都在咨询。 本文就来简单介绍下关于电脑任务栏个性化设置的方法&#xff0c;毕竟任务栏影响着用户体验。这时&#xff0c;一款优秀的任务栏优化工具就…

DBA实战手记,技术书的黑神话

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、 高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

线性方程组求解——预处理Preconditioning介绍

为什么需要预处理&#xff1f; 工程中出现的大规模线性方程组往往是病态的, 对数值求解带来很大的困难: ▶ 使得迭代法(比如Krylov 子空间迭代法) 收敛变得非常缓慢 ▶ 对数值解的精度产生很大的影响(在有限精度计算情形下) 对于第一个问题, 当前的有效处理方法是预处理, 预处…

day43(9/4)——k8s

一、前期准备 1、配置主机映射 [rootk8s-master ~]# vim /etc/hosts 192.168.8.168 k8s-master 192.168.8.176 k8s-node1 192.168.8.177 k8s-node2 [rootk8s-master ~]# ping k8s-master 2、配置yum源 [rootk8s-master yum.repos.d]# vim kubernetes.repo [kubernetes…

高职人工智能训练师边缘计算实训室解决方案

一、引言 随着物联网&#xff08;IoT&#xff09;、大数据、人工智能&#xff08;AI&#xff09;等技术的飞速发展&#xff0c;计算需求日益复杂和多样化。传统的云计算模式虽在一定程度上满足了这些需求&#xff0c;但在处理海量数据、保障实时性与安全性、提升计算效率等方面…

深圳建站公司-如何做网站

深圳建站公司&#xff1a;如何制作一个成功的网站 在信息化快速发展的今天&#xff0c;企业和个人越来越重视网络形象&#xff0c;网站成为了展示品牌、推广产品和服务的重要平台。深圳作为科技创新和经济发展的前沿城市&#xff0c;涌现出许多专业的建站公司&#xff0c;能够为…

CATH标识符解读

在CATH数据库中&#xff0c;标识符如1a0rB00、1a0rP01、1a0rP02代表的是蛋白质结构的具体信息&#xff0c;主要涉及PDB编号、链ID以及结构域。让我们具体解释这些标识符的含义。 CATH标识符的组成 CATH标识符通常由以下几个部分组成&#xff1a; PDB ID&#xff1a;代表蛋白…

基于SpringBoot的家具销售电商平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员功能界面…

MongoDB日志级别

日志 查看当前的日志级别 根据你提供的 MongoDB 命令结果&#xff0c;命令 db.adminCommand({ getParameter: "logComponentVerbosity" }) 返回了 "ok" : 0&#xff0c;这意味着命令执行失败&#xff0c;没有成功获取到日志级别的配置信息。错误信息 &quo…