mysql 字符串的hash函数_【转载】字符串Hash函数比较
常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法。这些函数使用位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎不可能找到碰撞。
常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等。对于以上几种哈希函数,我对其进行了一个小小的评测。
Hash函数
数据1
数据2
数据3
数据4
数据1得分
数据2得分
数据3得分
数据4得分
平均分
BKDRHash
2
0
4774
481
96.55
100
90.95
82.05
92.64
APHash
2
3
4754
493
96.55
88.46
100
51.28
86.28
DJBHash
2
2
4975
474
96.55
92.31
0
100
83.43
JSHash
1
4
4761
506
100
84.62
96.83
17.95
81.94
RSHash
1
0
4861
505
100
100
51.58
20.51
75.96
SDBMHash
3
2
4849
504
93.1
92.31
57.01
23.08
72.41
PJWHash
30
26
4878
513
0
0
43.89
0
21.95
ELFHash
30
26
4878
513
0
0
43.89
0
21.95
其中数据1为100000个字母和数字组成的随机串哈希冲突个数。数据2为100000个有意义的英文句子哈希冲突个数。数据3为数据1的哈希值与 1000003(大素数)求模后存储到线性表中冲突的个数。数据4为数据1的哈希值与10000019(更大素数)求模后存储到线性表中冲突的个数。
经过比较,得出以上平均得分。平均数为平方平均数。可以发现,BKDRHash无论是在实际效果还是编码实现中,效果都是最突出的。APHash也 是较为优秀的算法。DJBHash,JSHash,RSHash与SDBMHash各有千秋。PJWHash与ELFHash效果最差,但得分相似,其算 法本质是相似的。
在信息修竞赛中,要本着易于编码调试的原则,个人认为BKDRHash是最适合记忆和使用的。
CmYkRgB123原创,欢迎建议、交流、批评和指正。
附:各种哈希函数的C语言程序代码
Code1 unsignedintSDBMHash(char*str)2 {3 unsignedinthash=0;4 5 while(*str)6 {7 //equivalent to: hash = 65599*hash + (*str++);8 hash=(*str++)+(hash<<6)+(hash<<16)-hash;9 }10 11 return(hash&0x7FFFFFFF);12 }13 14 //RS Hash Function15 unsignedintRSHash(char*str)16 {17 unsignedintb=378551;18 unsignedinta=63689;19 unsignedinthash=0;20 21 while(*str)22 {23 hash=hash*a+(*str++);24 a*=b;25 }26 27 return(hash&0x7FFFFFFF);28 }29 30 //JS Hash Function31 unsignedintJSHash(char*str)32 {33 unsignedinthash=1315423911;34 35 while(*str)36 {37 hash^=((hash<<5)+(*str++)+(hash>>2));38 }39 40 return(hash&0x7FFFFFFF);41 }42 43 //P. J. Weinberger Hash Function44 unsignedintPJWHash(char*str)45 {46 unsignedintBitsInUnignedInt=(unsignedint)(sizeof(unsignedint)*8);47 unsignedintThreeQuarters=(unsignedint)((BitsInUnignedInt*3)/4);48 unsignedintOneEighth=(unsignedint)(BitsInUnignedInt/8);49 unsignedintHighBits=(unsignedint)(0xFFFFFFFF)<>ThreeQuarters))&(~HighBits));59 }60 }61 62 return(hash&0x7FFFFFFF);63 }64 65 //ELF Hash Function66 unsignedintELFHash(char*str)67 {68 unsignedinthash=0;69 unsignedintx=0;70 71 while(*str)72 {73 hash=(hash<<4)+(*str++);74 if((x=hash&0xF0000000L)!=0)75 {76 hash^=(x>>24);77 hash&=~x;78 }79 }80 81 return(hash&0x7FFFFFFF);82 }83 84 //BKDR Hash Function85 unsignedintBKDRHash(char*str)86 {87 unsignedintseed=131;//31 131 1313 13131 131313 etc..88 unsignedinthash=0;89 90 while(*str)91 {92 hash=hash*seed+(*str++);93 }94 95 return(hash&0x7FFFFFFF);96 }97 98 //DJB Hash Function99 unsignedintDJBHash(char*str)100 {101 unsignedinthash=5381;102 103 while(*str)104 {105 hash+=(hash<<5)+(*str++);106 }107 108 return(hash&0x7FFFFFFF);109 }110 111 //AP Hash Function112 unsignedintAPHash(char*str)113 {114 unsignedinthash=0;115 inti;116 117 for(i=0;*str; i++)118 {119 if((i&1)==0)120 {121 hash^=((hash<<7)^(*str++)^(hash>>3));122 }123 else124 {125 hash^=(~((hash<<11)^(*str++)^(hash>>5)));126 }127 }128 129 return(hash&0x7FFFFFFF);130 }
mysql 字符串的hash函数_【转载】字符串Hash函数比较相关推荐
- matlab中ss函数_[转载]matlab ss函数 tf函数
ss 指定状态空间模型或者将线性时不变系统转成状态空间 语法 ss sys = ss(a,b,c,d) sys = ss(a,b,c,d,Ts) sys = ss(d) sys = ss(a,b,c, ...
- mysql 字符串的hash函数_经典字符串Hash函数介绍 - yanjun_1982的专栏 - CSDNBlog
作者阅读过大量经典软件原代码,下面分别介绍几个经典软件中出现的字符串Hash函数. 2.1 PHP中出现的字符串Hash函数 static unsigned long hashpjw(char *ar ...
- 截取字符串的函数_常用的Excel函数
1.条件判断:IF函数应用 数据 目的:判断成绩所属的等级 方法:在目标单元格中输入公式:=IF(C2>=90,"优秀",IF(C2>=80,"良好" ...
- 测量string变量长度函数_利用Graphics::MeasureString函数测量字符串的宽度,高度
我就吐一句槽,今天被这个函数完虐.... 当我们需要获得一个字符串的长度时(注意,不是length,这只是返回该字符串的字符个数),我们需要知道的是一个字符串的长度也就是一个字符串的宽,说到底就是像素 ...
- mysql数据库uuid函数_[转载]MySQL UUID() 函数
目录 文/温国兵 一 引子 在 MySQL 中,可以有如下几种途径实现唯一值: 自增序列 UUID() 函数 程序自定义 UUID 基于 16 进制,由 32 位小写的 16 进制数字组成,如下: a ...
- mysql数据库支持的函数_数据库MySQL--常见函数
函数:将一组逻辑语句封装在函数体中,对外暴露函数名 调用:select 函数名() from 表:(若用到表中的字段则家上'from 表') 函数分类: 1.单行函数(例:concate.leng ...
- python判断字符串是否回文_判断字符串是否为回文 python
回文正序和逆序一样的字符串,例如abccba 方法一 def is_palindrome1(text): l = list(text) l.reverse() t1 = ''.join(l) if t ...
- python transpose函数_转载:numpy中transpose和swapaxes函数讲解
看<利用python进行数据分析>,有些不大清楚numpy中transpose和swapaxes函数的原理,这篇文章写的比较清楚,转载过来方便个人随时阅读和温习 版权声明:本文为CSDN博 ...
- python函数定义错误_[转载]python之函数的使用及异常处理2021.1.30
2.1 定义函数 def 函数名(参数): 代码1 代码2 ...... 2.2 调⽤函数 函数名(参数) 注意: 1. 不同的需求,参数可有可⽆. 2. 在Python中,函数必须先定义后使⽤. 2 ...
- spyder中绘图无法显示负号_[转载]Matlab常用函数
计算样本的百份位数 Matlab的常用内部数学函数 指数函数 exp(x) 以e为底数 对数函数 log(x) 自然对数,即以e为底数的对数 log10(x) 常用对数,即以10为底数的对数 log2 ...
最新文章
- C#使用Tesseract OCR 解析验证码
- 用户登录,token验证开发(含过期时间)
- 喜马拉雅贺雯迪:基于端到端TTS实现更具生动、富有情感的语音合成表现
- 信用卡逾期记录已经超过5年,为何还不能申请贷款?
- [转]闲话操作系统1
- flink java生成流式数据
- 开机后系统时间被恶意修改
- Codeforces 490F Treeland Tour(离散化 + 线段树合并)
- C#中MessageBox用法大全(附效果图)
- Solidworks常见问题一览
- 移动端html字体大小自适应,【css】移动端响应式布局与响应式字体大小
- bat脚本_更改文件夹访问权限
- 四色定理c语言,阅读下列程序说明和C代码,将应填入(n)处。【程序5说明】著名的四色定理指出..._考试资料网...
- python打错了怎么删掉_python写错了怎么删除
- leedcode.21合并两个有序链表
- matlab:已知传递函数,求单位阶跃响应
- 好佳居窗帘十大品牌 窗帘需要装窗幔吗
- 算法研究之二叉树小球下落
- win7计算机无法连接投影仪,win7系统无法连接投影仪的解决方法
- 博士申请 | 美国乔治梅森大学计算机系招收机器学习方向全奖博士生