常见的一些 Hash 函数
生活随笔
收集整理的這篇文章主要介紹了
常见的一些 Hash 函数
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Hash的主要原理就是把大范圍映射到小范圍;所以,你輸入的實(shí)際值的個(gè)數(shù)必須和小范圍相當(dāng)或者比它更小。不然沖突就會(huì)很多。
不同的應(yīng)用對(duì)Hash函數(shù)有著不同的要求;比如,用于加密的Hash函數(shù)主要考慮它和單項(xiàng)函數(shù)的差距,而用于查找的Hash函數(shù)主要考慮它映射到小范圍的沖突率。
下面介紹一些常用的用于查詢Hash函數(shù)。
加法Hash
public class AdditiveHash {@Testpublic void additionHashDemo() {int result = this.additiveHash("mykey", 31);System.out.println(result);}/*** 加法hash, 把輸入元素一個(gè)一個(gè)的加起來構(gòu)成最后的結(jié)果* @param prime 任意的質(zhì)數(shù)。質(zhì)數(shù)可以降低碰撞的概率* @return 結(jié)果在 [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; //除以 一個(gè)prime的目的只是為了保證結(jié)果的范圍} }位運(yùn)算Hash
@Test public void rotatingHashDemo() {int hash = this.rotatingHash("key", 31);System.out.println(hash); }/*** 標(biāo)準(zhǔn)的旋轉(zhuǎn)hash, 通過先移位,在進(jìn)行各種位運(yùn)算。 比如某個(gè)學(xué)校同一系的新生,學(xué)號(hào)前5位相同,最后2位不同,* 將最后2位旋轉(zhuǎn)放置前兩位,其余的右移。這樣只要輸入前兩位,就可以快速查出學(xué)生的信息。* @param key hash key* @param prime 任意的質(zhì)數(shù)。質(zhì)數(shù)可以降低碰撞的概率*/ 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); //除以 一個(gè)prime的目的只是為了保證結(jié)果的范圍 }乘法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. 乘數(shù)可以是31, 131, 1313。。。<br/>* @param key hash key* @param prime 質(zhì)數(shù)*/ 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; }/*** 乘以一個(gè)不斷該不變的數(shù)* @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); }總結(jié)
以上是生活随笔為你收集整理的常见的一些 Hash 函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java一致性Hash算法的实现
- 下一篇: RocketMQ Consumer 负载