常见的一些 Hash 函数
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 函数相关推荐
- 常见的hash函数算法
散列表,它是基于快速存取的角度设计的,也是一种典型的"空间换时间"的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Has ...
- hash算法和常见的hash函数
Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre--mage),通过散列算法,变换成固定长度的输出,该输出就 ...
- Hash函数经典用法
撰写这篇文章之前,先谈下个人对程序员编程素养的理解: 程序员除了数据结构与算法,什么也不属于自己---记得哪个NB人物曾经说过这样的话.的确,程序员水平高低如何,很大程度上取决于基本功是否扎实.高级程 ...
- hash函数的简单介绍
HASH函数 应用Hash函数 作者:冲处宇宙 时间:2007.1.25 计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的 ...
- 第六章、Hash函数
1.Hash函数 1.Hash函数(也称散列函数)是一个将任意长度的消息x序列映射为较短的.固定长度的一个值y的函数. 2.Hash函数的目的是为需要认证的数据产生一个'指纹'. 为了能够实现对数据的 ...
- 哈希算法(Hash函数)简单介绍
1.什么是哈希算法?(Hash函数) 哈希算法的定义和原理: 将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则,就是哈希算法.而通过原始数据映射之后得到的二进制值串就是哈希值. 设计一 ...
- Hash函数与算法、哈希查找、哈希冲突解决方法总结
Hash哈希知识点导航 1.基本概念 2. 哈希函数 2.1 直接寻址法 2.2 数字分析法 2.3 平方取中法 2.4 折叠法 2.5 随机数法 2.6 除留余数法 3. 哈 ...
- linux哈希函数,OpenSSL下hash函数
OpenSSL下hash函数:是不可逆的函数,它的输入可以是任意长度的字节流.它的输出是固定大小的,hash函数的作用就是给你的文件产生一个摘要,它是独一无二的. 通过OpenSSL提供FTP+SSL ...
- [现代密码学] Crypto 知识点总结(古典密码对称加密hash函数)
文章目录 一 . 常见加解密 SM1-4 二. 古典密码 代换密码 置换密码 Hill密码 转轮密码 代换密码的唯密文攻击 例题 例题 三. 对称加密算法 分组密码 DES算法(数据加密标准) 1. ...
最新文章
- python端午dragboat消消乐 美轮美奂的界面效果
- 高性能千万级定时任务管理服务forsun使用详解
- AlphaZero登上《科学》封面:一个算法“通杀”三大棋,完整论文首次发布
- Jmeter简单应用6
- JAX-RS客户端WebClient的使用教程
- 计算机控制系统为什么会受到干扰,浅谈计算机控制系统中的干扰及其抑制措施...
- js笔记(四)内置对象Math和Date()、浏览器对象模型BOM
- 【Vegas2006】8月24日-花豆擀面做法
- 【转】正则表达式–零宽断言详解
- javascript 绘制uml_Javascript 设计模式之面向对象与 UML 类图
- 阻抗匹配及Smith圆图简介笔记
- python 安装失败 errorcode 2203_win10系统安装软件出现the error code is 2203错误怎么办...
- 短视频运营详解:抖音变现目前流行的是七种方式之一电商卖货
- 写给即将毕业的同学们
- Mac电脑快速切换输入法!自动切换输入法!
- AD19技术笔记-常用PCB设计思路-布线篇(一)
- 示波器连接matlab,matlab与示波器连接及电脑连接
- 4个知识点帮你理清ARM开发思路!
- 人生旅程需要自己去把握
- sql server中对日期字段值的比较