常用的哈希函数
 
通用的哈希函数库有下面这些混合了加法和一位操作的字符串哈希算法。下面的这些算法在用法和功能方面各有不同,但是都可以作为学习哈希算法的实现的例子。
 
1.RS 
从Robert Sedgwicks的 Algorithms in C一书中得到了。已经添加了一些简单的优化的算法,以加快其散列过程。
  1. public long RSHash(String str)
  2. {
  3. int b     = 378551;
  4. int a     = 63689;
  5. long hash = 0;
  6. for(int i = 0; i < str.length(); i++)
  7. {
  8. hash = hash * a + str.charAt(i);
  9. a    = a * b;
  10. }
  11. return hash;
  12. }
2.JS
Justin Sobel写的一个位操作的哈希函数。
  1. public long JSHash(String str)
  2. {
  3. long hash = 1315423911;
  4. for(int i = 0; i < str.length(); i++)
  5. {
  6. hash ^= ((hash << 5) + str.charAt(i) + (hash >> 2));
  7. }
  8. return hash;
  9. }
3.PJW 
该散列算法是基于贝尔实验室的彼得J温伯格的的研究。在Compilers一书中(原则,技术和工具),建议采用这个算法的散列函数的哈希方法。
  1. public long PJWHash(String str)
  2. {
  3. long BitsInUnsignedInt = (long)(4 * 8);
  4. long ThreeQuarters     = (long)((BitsInUnsignedInt  * 3) / 4);
  5. long OneEighth         = (long)(BitsInUnsignedInt / 8);
  6. long HighBits          = (long)(0xFFFFFFFF) << (BitsInUnsignedInt - OneEighth);
  7. long hash              = 0;
  8. long test              = 0;
  9. for(int i = 0; i < str.length(); i++)
  10. {
  11. hash = (hash << OneEighth) + str.charAt(i);
  12. if((test = hash & HighBits)  != 0)
  13. {
  14. hash = (( hash ^ (test >> ThreeQuarters)) & (~HighBits));
  15. }
  16. }
  17. return hash;
  18. }
4.ELF 
和PJW很相似,在Unix系统中使用的较多。
  1. public long ELFHash(String str)
  2. {
  3. long hash = 0;
  4. long x    = 0;
  5. for(int i = 0; i < str.length(); i++)
  6. {
  7. hash = (hash << 4) + str.charAt(i);
  8. if((x = hash & 0xF0000000L) != 0)
  9. {
  10. hash ^= (x >> 24);
  11. }
  12. hash &= ~x;
  13. }
  14. return hash;
  15. }
5.BKDR
这个算法来自Brian Kernighan 和 Dennis Ritchie的 The C Programming Language。这是一个很简单的哈希算法,使用了一系列奇怪的数字,形式如31,3131,31...31,看上去和DJB算法很相似。(这个就是Java的字符串哈希函数)
  1. public long BKDRHash(String str)
  2. {
  3. long seed = 131; // 31 131 1313 13131 131313 etc..
  4. long hash = 0;
  5. for(int i = 0; i < str.length(); i++)
  6. {
  7. hash = (hash * seed) + str.charAt(i);
  8. }
  9. return hash;
  10. }
6.SDBM
这个算法在开源的SDBM中使用,似乎对很多不同类型的数据都能得到不错的分布。
  1. public long SDBMHash(String str)
  2. {
  3. long hash = 0;
  4. for(int i = 0; i < str.length(); i++)
  5. {
  6. hash = str.charAt(i) + (hash << 6) + (hash << 16) - hash;
  7. }
  8. return hash;
  9. }
7.DJB
这个算法是Daniel J.Bernstein 教授发明的,是目前公布的最有效的哈希函数。
  1. public long DJBHash(String str)
  2. {
  3. long hash = 5381;
  4. for(int i = 0; i < str.length(); i++)
  5. {
  6. hash = ((hash << 5) + hash) + str.charAt(i);
  7. }
  8. return hash;
  9. }
8.DEK
由伟大的Knuth在《编程的艺术 第三卷》的第六章排序和搜索中给出。
  1. public long DEKHash(String str)
  2. {
  3. long hash = str.length();
  4. for(int i = 0; i < str.length(); i++)
  5. {
  6. hash = ((hash << 5) ^ (hash >> 27)) ^ str.charAt(i);
  7. }
  8. return hash;
  9. }
9.AP
这是Arash Partow贡献的一个哈希函数,继承了上面以旋转以为和加操作。代数描述:
  1. public long APHash(String str)
  2. {
  3. long hash = 0xAAAAAAAA;
  4. for(int i = 0; i < str.length(); i++)
  5. {
  6. if ((i & 1) == 0)
  7. {
  8. hash ^= ((hash << 7) ^ str.charAt(i) * (hash >> 3));
  9. }
  10. else
  11. {
  12. hash ^= (~((hash << 11) + str.charAt(i) ^ (hash >> 5)));
  13. }
  14. }
  15. return hash;
  16. }

常用hash函数的更多相关文章

  1. 字符串hash函数

    本文搜集了一些字符串的常用hash函数. 范例1:判断两个单词是否含有相同的字母,此时我们可以用hash做.例如,“aaabb”与"aabb"含有相同的单词.(参考:http:// ...

  2. Hash 函数及其重要性

    不时会爆出网站的服务器和数据库被盗取,考虑到这点,就要确保用户一些敏感数据(例如密码)的安全性.今天,我们要学的是 hash 背后的基础知识,以及如何用它来保护你的 web 应用的密码. 申明 密码学 ...

  3. 【学】常用hash算法的介绍

    基本知识 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映 ...

  4. 各种字符串Hash函数比较(转)

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

  5. hash函数为什么要选择对素数求余?

    常用的hash函数是选一个数m取模(余数),这个数在课本中推荐m是素数,但是经常见到选择m=2^n,因为对2^n求余数更快,并认为在key分布均匀的情况下,key%m也是在[0,m-1]区间均匀分布的 ...

  6. 理解php Hash函数,增强密码安全

    1.声明 密码学是一个复杂的话题,我也不是这方面的专家.许多高校和研究机构在这方面都有长期的研究.在这篇文章里,我希望尽量使用简单易懂的方式向你展示一种安全存储Web程序密码的方法. 2.“Hash” ...

  7. [转]各种字符串Hash函数比较

    转自:https://www.byvoid.com/zht/blog/string-hash-compare 常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些 ...

  8. 学习hash_map从而了解如何写stl里面的hash函数和equal或者compare函数

    ---恢复内容开始--- 看到同事用unordered_map了所以找个帖子学习学习 http://blog.sina.com.cn/s/blog_4c98b9600100audq.html (一)为 ...

  9. 【转】各种字符串Hash函数比较

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

随机推荐

  1. C语言基础学习运算符-关系运算符

    比较大小 首先,我们得先了解一下布尔类型.C语言的C99标准支持布尔类型,关键字为_Bool,用于表示逻辑值true与false.C语言用值1表示true, 用值0表示false.因此布尔类型实际上是 ...

  2. kafka+storm连接

    本项目为maven项目,需要添加必要的storm库,以及kafka依赖,使用storm自带的storm-kafka进行连接,根据自己集群环境 <dependency> <groupI ...

  3. FCKEditor使用说明

    1.基本设置   先看看效果是什么样的:   效果图: 那么为什么说是FCKeditor的冰冷之心呢?这不是哗众取宠,主要是说它使用起来有点麻烦,下文就详细说明如何搞定这玩意儿. 1.FCKedito ...

  4. centos 安装 mongo3.0

    官方网站传贴,每次去翻doc,麻烦 vi  /etc/yum.repos.d/mongodb-org-3.0.repo [mongodb-org-3.0]name=MongoDB Repository ...

  5. Shortest Prefixes

    poj2001:http://poj.org/problem?id=2001 题意:给你一些单词,然后让你寻找每个单词的一个前缀,这个前缀能够唯一表示这个单词,并且是最短的. 题解:直接用trie树来 ...

  6. [项目构建 十四]babasport Mycat配置及使用详解.

    首先我们来看下什么是Mycat:MyCat:开源分布式数据库中间件, 这里定义的很简单, 就是分布式数据库的中间件. 其实Mycat 是可以时mysql进行集群的中间件, 我们可以对mysql来分库分 ...

  7. 线程通信机制:共享内存 VS 消息传递

    在并发编程中,我们必须考虑的问题时如何在两个线程间进行通讯.这里的通讯指的是不同的线程之间如何交换信息. 目前有两种方式: 1.共享内存 2.消息传递(actor 模型) 共享内存: 共享内存这种方式 ...

  8. sql server 2005中使用with实现递归

    WITH fw_requestion_note_temp(old_apply_id) AS ( --取根节点放入临时表 SELECT old_apply_id FROM fw_requestion_n ...

  9. 树形dp-CF-337D. Book of Evil

    题目链接: http://codeforces.com/problemset/problem/337/D 题目大意: 给一棵树,m个点,一个距离d,求有多少个点A,使得A到所有的m个点距离都不超过d. ...

  10. !!!全球最流行开源硬件平台!不知道就OUT了!

    全球最流行的几个开源硬件平台!不知道就OUT了! 随着物联网的推广和普及,五年内全球会有200亿台智能设备的需求,而如今随着创客概念的兴起,开源硬件也越加的火热,让我们来看看现在都有哪些主流的开源硬件 ...