常用的字符串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函数比较相关推荐

  1. 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, ...

  2. mysql 字符串的hash函数_经典字符串Hash函数介绍 - yanjun_1982的专栏 - CSDNBlog

    作者阅读过大量经典软件原代码,下面分别介绍几个经典软件中出现的字符串Hash函数. 2.1 PHP中出现的字符串Hash函数 static unsigned long hashpjw(char *ar ...

  3. 截取字符串的函数_常用的Excel函数

    1.条件判断:IF函数应用 数据 目的:判断成绩所属的等级 方法:在目标单元格中输入公式:=IF(C2>=90,"优秀",IF(C2>=80,"良好" ...

  4. 测量string变量长度函数_利用Graphics::MeasureString函数测量字符串的宽度,高度

    我就吐一句槽,今天被这个函数完虐.... 当我们需要获得一个字符串的长度时(注意,不是length,这只是返回该字符串的字符个数),我们需要知道的是一个字符串的长度也就是一个字符串的宽,说到底就是像素 ...

  5. mysql数据库uuid函数_[转载]MySQL UUID() 函数

    目录 文/温国兵 一 引子 在 MySQL 中,可以有如下几种途径实现唯一值: 自增序列 UUID() 函数 程序自定义 UUID 基于 16 进制,由 32 位小写的 16 进制数字组成,如下: a ...

  6. mysql数据库支持的函数_数据库MySQL--常见函数

    函数:将一组逻辑语句封装在函数体中,对外暴露函数名 调用:select 函数名() from 表:(若用到表中的字段则家上'from 表') 函数分类:   1.单行函数(例:concate.leng ...

  7. python判断字符串是否回文_判断字符串是否为回文 python

    回文正序和逆序一样的字符串,例如abccba 方法一 def is_palindrome1(text): l = list(text) l.reverse() t1 = ''.join(l) if t ...

  8. python transpose函数_转载:numpy中transpose和swapaxes函数讲解

    看<利用python进行数据分析>,有些不大清楚numpy中transpose和swapaxes函数的原理,这篇文章写的比较清楚,转载过来方便个人随时阅读和温习 版权声明:本文为CSDN博 ...

  9. python函数定义错误_[转载]python之函数的使用及异常处理2021.1.30

    2.1 定义函数 def 函数名(参数): 代码1 代码2 ...... 2.2 调⽤函数 函数名(参数) 注意: 1. 不同的需求,参数可有可⽆. 2. 在Python中,函数必须先定义后使⽤. 2 ...

  10. spyder中绘图无法显示负号_[转载]Matlab常用函数

    计算样本的百份位数 Matlab的常用内部数学函数 指数函数 exp(x) 以e为底数 对数函数 log(x) 自然对数,即以e为底数的对数 log10(x) 常用对数,即以10为底数的对数 log2 ...

最新文章

  1. C#使用Tesseract OCR 解析验证码
  2. 用户登录,token验证开发(含过期时间)
  3. 喜马拉雅贺雯迪:基于端到端TTS实现更具生动、富有情感的语音合成表现
  4. 信用卡逾期记录已经超过5年,为何还不能申请贷款?
  5. [转]闲话操作系统1
  6. flink java生成流式数据
  7. 开机后系统时间被恶意修改
  8. Codeforces 490F Treeland Tour(离散化 + 线段树合并)
  9. C#中MessageBox用法大全(附效果图)
  10. Solidworks常见问题一览
  11. 移动端html字体大小自适应,【css】移动端响应式布局与响应式字体大小
  12. bat脚本_更改文件夹访问权限
  13. 四色定理c语言,阅读下列程序说明和C代码,将应填入(n)处。【程序5说明】著名的四色定理指出..._考试资料网...
  14. python打错了怎么删掉_python写错了怎么删除
  15. leedcode.21合并两个有序链表
  16. matlab:已知传递函数,求单位阶跃响应
  17. 好佳居窗帘十大品牌 窗帘需要装窗幔吗
  18. 算法研究之二叉树小球下落
  19. win7计算机无法连接投影仪,win7系统无法连接投影仪的解决方法
  20. 博士申请 | 美国乔治梅森大学计算机系招收机器学习方向全奖博士生

热门文章

  1. Easy Recovery帮你解决数据丢失的苦恼
  2. 账号集中管理系统设计与实现----OpenLDAP
  3. linux学习笔记-日常运维
  4. android图片加水印,文字
  5. C++day08 学习笔记
  6. 重新认识鸿鹄与燕雀的区别
  7. Epic Citadel Demo展示互联网作为游戏平台的巨大能量
  8. C语言调用函数将is替换为be,C语言程序设计课件ppt.ppt
  9. 【数据结构】栈、队列、堆的python实现
  10. ajax 导致 css 延迟_在H5,小程序,uni-app中使用animate.css