原文来自https://www.byvoid.com/blog/string-hash-compare/

好文章,果断存自己的blog。

常用的字符串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是最适合记忆和使用的。

BYVoid原创,欢迎建议、交流、批评和指正。

附:各种哈希函数的C语言程序代码

unsigned int SDBMHash(char *str)
{unsigned int hash = 0;while (*str){// equivalent to: hash = 65599*hash + (*str++);hash = (*str++) + (hash << 6) + (hash << 16) - hash;}return (hash & 0x7FFFFFFF);
}// RS Hash Function
unsigned int RSHash(char *str)
{unsigned int b = 378551;unsigned int a = 63689;unsigned int hash = 0;while (*str){hash = hash * a + (*str++);a *= b;}return (hash & 0x7FFFFFFF);
}// JS Hash Function
unsigned int JSHash(char *str)
{unsigned int hash = 1315423911;while (*str){hash ^= ((hash << 5) + (*str++) + (hash >> 2));}return (hash & 0x7FFFFFFF);
}// P. J. Weinberger Hash Function
unsigned int PJWHash(char *str)
{unsigned int BitsInUnignedInt = (unsigned int)(sizeof(unsigned int) * 8);unsigned int ThreeQuarters    = (unsigned int)((BitsInUnignedInt  * 3) / 4);unsigned int OneEighth        = (unsigned int)(BitsInUnignedInt / 8);unsigned int HighBits         = (unsigned int)(0xFFFFFFFF) << (BitsInUnignedInt - OneEighth);unsigned int hash             = 0;unsigned int test             = 0;while (*str){hash = (hash << OneEighth) + (*str++);if ((test = hash & HighBits) != 0){hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));}}return (hash & 0x7FFFFFFF);
}// ELF Hash Function
unsigned int ELFHash(char *str)
{unsigned int hash = 0;unsigned int x    = 0;while (*str){hash = (hash << 4) + (*str++);if ((x = hash & 0xF0000000L) != 0){hash ^= (x >> 24);hash &= ~x;}}return (hash & 0x7FFFFFFF);
}// BKDR Hash Function
unsigned int BKDRHash(char *str)
{unsigned int seed = 131; // 31 131 1313 13131 131313 etc..unsigned int hash = 0;while (*str){hash = hash * seed + (*str++);}return (hash & 0x7FFFFFFF);
}// DJB Hash Function
unsigned int DJBHash(char *str)
{unsigned int hash = 5381;while (*str){hash += (hash << 5) + (*str++);}return (hash & 0x7FFFFFFF);
}// AP Hash Function
unsigned int APHash(char *str)
{unsigned int hash = 0;int i;for (i=0; *str; i++){if ((i & 1) == 0){hash ^= ((hash << 7) ^ (*str++) ^ (hash >> 3));}else{hash ^= (~((hash << 11) ^ (*str++) ^ (hash >> 5)));}}return (hash & 0x7FFFFFFF);
}

各种字符串Hash函数比较相关推荐

  1. 各种字符串Hash函数

    整理了一下几个字符串hash函数,使用了模板,使其支持宽字符串,代码如下: /// @brief BKDR Hash Function /// @detail 本算法由于在Brian Kernigha ...

  2. mysql 字符串的hash函数_【转载】字符串Hash函数比较

    常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些函数使用位运算使得每一个字符都对最后的函数值产生影响.另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎 ...

  3. 字符串Hash函数对比

    今天根据自己的理解重新整理了一下几个字符串hash函数,使用了模板,使其支持宽字符串,代码如下: /// @brief BKDR Hash Function /// @detail 本算法由于在Bri ...

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

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

  5. Hash 函数资源链接汇总

    Hash 链接: [1]General Purpose Hash Function Algorithms:http://www.partow.net/programming/hashfunctions ...

  6. hash算法和常见的hash函数

    Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre--mage),通过散列算法,变换成固定长度的输出,该输出就 ...

  7. 各种Hash函数和代码

    ref: http://www.cppblog.com/bellgrade/archive/2009/09/29/97565.html -------- 常用的字符串Hash函数还有ELFHash,A ...

  8. 兔子与兔子 字符串hash

    题目链接 https://www.acwing.com/problem/content/140/ 题意 很久很久以前,森林里住着一群兔子. 有一天,兔子们想要研究自己的 DNA 序列. 我们首先选取一 ...

  9. 0x14.基础数据结构 — hash表与字符串hash

    目录 一.Hash表 1.AcWing 137. 雪花雪花雪花 0.hash表+链表 1.字符串的最小表示法 二.字符串hashhashhash 0.AcWing 138. 兔子与兔子 1.luogu ...

最新文章

  1. FastDFS 安装步骤(ubuntu)
  2. 互联网1分钟 |1101
  3. 人人都能够做深度学习应用:入门篇
  4. 股票冲高回落意味着什么?
  5. ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第五天(非原创)
  6. mysql 优化代码_Mysql语句-优化代码
  7. 802.x无线认证服务器,无线802.1X认证
  8. 图像分割法-snake
  9. 傅里叶级数与积分方程
  10. 计算机基础a3知识点,《计算机应用基础》期末试卷A(A3版).doc
  11. mp-mtgsig 美团iOS 签名逆向工程分析
  12. 指标之王macd的计算公式和使用方法
  13. 格林酒店2020年第三季度营收为2.67亿元,恢复至同期91.4%
  14. 2012年主流U盘启动盘制作工具合集下载
  15. 曼哈顿算法公式_Manhattan Distance Calculation(曼哈顿距离算法)
  16. C3P0、狂生说MySQL、: No suitable driver
  17. vue实现盒子的拖拽移动
  18. 人工智能中的术语及缩略语
  19. win8文件操作以及音视频的应用
  20. L2-020 功夫传人 (25分)(双解法 完整思路+极短代码)

热门文章

  1. mysql研究内容_基于MySQL数据库的数据管理的研究
  2. 线性动态规划-文件排版
  3. 线性神经网络原理以及MATLAB算法实现权值拟合和可线性分类
  4. TMC5160步进电机驱动芯片开发手记
  5. 华为云,奔跑的感觉爽吗?
  6. 东软睿驰获本田加持的背后:传统车企与新势力的对垒升级
  7. 从六度分隔到无尺度网络
  8. 你见过出身最奇特的程序员是什么样的?
  9. Mockito 中被 Mocked 的对象属性及方法的默认值
  10. python 写一个幸运大转盘抽奖脚本