Hash的主要原理就是把大范围映射到小范围;所以,你输入的实际值的个数必须和小范围相当或者比它更小。不然冲突就会很多。

不同的应用对Hash函数有着不同的要求;比如,用于加密的Hash函数主要考虑它和单项函数的差距,而用于查找的Hash函数主要考虑它映射到小范围的冲突率。

下面介绍一些常用的用于查询Hash函数。

加法Hash

public class AdditiveHash {@Testpublic void additionHashDemo() {int result = this.additiveHash("mykey", 31);System.out.println(result);}/*** 加法hash, 把输入元素一个一个的加起来构成最后的结果* @param prime 任意的质数。质数可以降低碰撞的概率* @return 结果在 [0, prime-1]*/private int additiveHash(String key, int prime) {int hash;int i;for (hash = key.length(), i = 0; i < key.length(); i++ ) {hash += key.charAt(i);}return hash % prime;   //除以 一个prime的目的只是为了保证结果的范围}
}

位运算Hash

@Test
public void rotatingHashDemo() {int hash = this.rotatingHash("key", 31);System.out.println(hash);
}/*** 标准的旋转hash, 通过先移位,在进行各种位运算。 比如某个学校同一系的新生,学号前5位相同,最后2位不同,* 将最后2位旋转放置前两位,其余的右移。这样只要输入前两位,就可以快速查出学生的信息。* @param key hash key* @param prime 任意的质数。质数可以降低碰撞的概率*/
private int rotatingHash(String key, int prime) {int hash;int i;for (hash = key.length(), i = 0; i < key.length(); i++) {hash = (hash<<4)^(hash>>28)^key.charAt(i);}return (hash % prime);  //除以 一个prime的目的只是为了保证结果的范围
}

乘法Hash

@Test
public void bernsteinHashDemo() {int result = this.bernsteinHash("key", 31);System.out.println(result);
}@Test
public void RSHashDemo() {int result = this.RSHash("key");System.out.println(result);
}/*** jdk5.0 中 string 的 hashCode() 方法使用的就是这种乘法hash. 乘数可以是31, 131, 1313。。。<br/>* @param key hash key* @param prime 质数*/
private int bernsteinHash(String key, int prime) {int hash = 0;int i;for (i = 0; i < key.length(); i++) {hash = prime * hash + key.charAt(i);}return hash;
}/*** 乘以一个不断该不变的数* @param key hash key* @return hash value*/
private int RSHash(String key) {int b = 37855;int a = 63689;int hash = 0;for (int i = 0; i < key.length(); i++) {hash = hash * a + key.charAt(i);a = a * b;}return (hash & 0x7FFFFFFF);
}

常见的一些 Hash 函数相关推荐

  1. 常见的hash函数算法

    散列表,它是基于快速存取的角度设计的,也是一种典型的"空间换时间"的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Has ...

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

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

  3. Hash函数经典用法

    撰写这篇文章之前,先谈下个人对程序员编程素养的理解: 程序员除了数据结构与算法,什么也不属于自己---记得哪个NB人物曾经说过这样的话.的确,程序员水平高低如何,很大程度上取决于基本功是否扎实.高级程 ...

  4. hash函数的简单介绍

    HASH函数 应用Hash函数 作者:冲处宇宙 时间:2007.1.25 计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的 ...

  5. 第六章、Hash函数

    1.Hash函数 1.Hash函数(也称散列函数)是一个将任意长度的消息x序列映射为较短的.固定长度的一个值y的函数. 2.Hash函数的目的是为需要认证的数据产生一个'指纹'. 为了能够实现对数据的 ...

  6. 哈希算法(Hash函数)简单介绍

    1.什么是哈希算法?(Hash函数) 哈希算法的定义和原理: 将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则,就是哈希算法.而通过原始数据映射之后得到的二进制值串就是哈希值. 设计一 ...

  7. Hash函数与算法、哈希查找、哈希冲突解决方法总结

    Hash哈希知识点导航 1.基本概念 2. 哈希函数   2.1 直接寻址法   2.2 数字分析法   2.3 平方取中法   2.4 折叠法   2.5 随机数法   2.6 除留余数法 3. 哈 ...

  8. linux哈希函数,OpenSSL下hash函数

    OpenSSL下hash函数:是不可逆的函数,它的输入可以是任意长度的字节流.它的输出是固定大小的,hash函数的作用就是给你的文件产生一个摘要,它是独一无二的. 通过OpenSSL提供FTP+SSL ...

  9. [现代密码学] Crypto 知识点总结(古典密码对称加密hash函数)

    文章目录 一 . 常见加解密 SM1-4 二. 古典密码 代换密码 置换密码 Hill密码 转轮密码 代换密码的唯密文攻击 例题 例题 三. 对称加密算法 分组密码 DES算法(数据加密标准) 1. ...

最新文章

  1. python端午dragboat消消乐 美轮美奂的界面效果
  2. 高性能千万级定时任务管理服务forsun使用详解
  3. AlphaZero登上《科学》封面:一个算法“通杀”三大棋,完整论文首次发布
  4. Jmeter简单应用6
  5. JAX-RS客户端WebClient的使用教程
  6. 计算机控制系统为什么会受到干扰,浅谈计算机控制系统中的干扰及其抑制措施...
  7. js笔记(四)内置对象Math和Date()、浏览器对象模型BOM
  8. 【Vegas2006】8月24日-花豆擀面做法
  9. 【转】正则表达式–零宽断言详解
  10. javascript 绘制uml_Javascript 设计模式之面向对象与 UML 类图
  11. 阻抗匹配及Smith圆图简介笔记
  12. python 安装失败 errorcode 2203_win10系统安装软件出现the error code is 2203错误怎么办...
  13. 短视频运营详解:抖音变现目前流行的是七种方式之一电商卖货
  14. 写给即将毕业的同学们
  15. Mac电脑快速切换输入法!自动切换输入法!
  16. AD19技术笔记-常用PCB设计思路-布线篇(一)
  17. 示波器连接matlab,matlab与示波器连接及电脑连接
  18. 4个知识点帮你理清ARM开发思路!
  19. 人生旅程需要自己去把握
  20. sql server中对日期字段值的比较

热门文章

  1. Netty系列(三):说说NioEventLoop
  2. Android SearchView 搜索框
  3. Linux--轻松定义自己的RPM/DEB软件包
  4. 虚拟机VMware 9安装苹果MAC OSX 10.8图文教程
  5. 警惕谷歌新形式的垄断
  6. matlab实现图像的高斯滤波
  7. 将h.264视频流封装成flv格式文件
  8. C++中的yield和fork
  9. VC++ 连接SQL Server数据库(远程+本地)
  10. 论文笔记:CycleGAN