常用的哈希函数
 
通用的哈希函数库有下面这些混合了加法和一位操作的字符串哈希算法。下面的这些算法在用法和功能方面各有不同,但是都可以作为学习哈希算法的实现的例子。
 
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. Day5 双层装饰器、字符串格式化、生成器、迭代器、递归

    双层装饰器实现用户登录和权限认证 #!/usr/bin/env python# -*- coding: utf-8 -*-# Author: WangHuafeng USER_INFO = {} de ...

  2. [Struts2学习笔记] -- 自定义类型转换

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  3. d038: 星罗密布

    内容: 输出图形 *****$***$$$*$$$$$ 规律是...自己发现吧. 要求输入3,输出上面三行的图形 输入说明: 行数小于40 输出说明:   输入样例:   3 输出样例 : ***** ...

  4. 【Maven实战】依赖的范围

    在Maven中有三大模块,分别是依赖.仓库.生命周期和插件,我们接下来下来介绍下依赖,为了方便起见我们还是以案例来说: 1.首先建立一个maven项目,这里我建立一个user的项目 2.接下来我们在这 ...

  5. Disabling Clang Compiler warnings

    开发中,经常需要禁止编译器提示某些warnings,下面是典型场景和 1,使用CocoaPods时,引用的其他人开发的Pods中包含warnings. 2,直接引用其他人写的源代码时,包括通过直接导入 ...

  6. Android 5.0 Lollipop初上手体验

    在等了好几天还没有等到OTA升级提示,前天笔者给Nexus4线刷入了官方提供的Lollipop的镜像,在试用了这两天之后,现在总结下自己感觉很惊艳的地方和一些地方的吐槽.(点击图片可以查看大图) 1. ...

  7. tomcat thread dump 分析【转载】

    前言 Java Thread Dump 是一个非常有用的应用诊断工具, 通过thread dump出来的信息, 可以定位到你需要了解的线程, 以及这个线程的调用栈. 如果配合linux的top命令, ...

  8. migration vmware vms to openstack kvm 修改vmware windows scsi to ide

  9. 自然数e这家伙怎么蹦跶出来的?

    自然数e这家伙怎么蹦跶出来的? 之前看过一篇中文介绍自然数e的blog,引起了我的兴趣 原文是阮一峰大牛(我认为必须很有必要尊敬的称,大牛)嚼烂了吐出来的哈哈,只是我认为还是自己去看原文比較好 感觉非 ...

  10. CentOS 6.3下rsync服务器的安装与配置[转]

    CentOS 6.3下rsync服务器的安装与配置   一.rsync 简介 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也 ...