原文链接:https://www.cnblogs.com/qijunhui/p/8445484.html
常用字符串哈希函数
BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等
性能
经过比较BKDRHash无论是在实际效果还是编码实现中,效果都是最突出的。APHash也是较为优秀的算法。DJBHash,JSHash,RSHash与SDBMHash各有千秋。PJWHash与ELFHash效果最差,但得分相似,其算法本质是相似的。
代码实现
1.BKDRHash
/* 【算法】BKDRHash(Java字符串类的Hash算法,累成因子取31)
* 【说明】累成因子可以为31/131/1313/13131/131313...
* */
public class BKDRHash {
//BKDRHash算法
static long BKDR_Hash(String str){
long seed=131;
long hash=0;
for(int i=0;i<str.length();i++){
hash=hash*seed+str.charAt(i);
//System.out.println(hash);
}
return (hash & 0x7FFFFFFF);//32位
//return (hash & 0x7FFFFFFFFFFFFFFFL);//64位
}
//主函数
public static void main(String[] args) {
System.out.println(Long.toBinaryString(BKDR_Hash("哈哈哈")));
}
}
2.RSHash
/* 【算法】RSHash(因Robert Sedgwicks在其《Algorithms in C》一书中展示而得名)
* 【说明】63689和378551都是质数,之所以取这两个数,我想是因为抗碰撞小(散列分布均匀)
* */
public class RSHash {
//RSHash算法
static long RS_Hash(String str){
int a=63689;
int b=378551;
long hash=0;
for(int i=0;i<str.length();i++){
hash=hash*a+str.charAt(i);
//System.out.println(hash);
a=a*b;
//System.out.println(a);
}
return (hash & 0x7FFFFFFF);//32位
//return (hash & 0x7FFFFFFFFFFFFFFFL);//64位
}
//主函数
public static void main(String[] args) {
System.out.println(Long.toBinaryString(RS_Hash("哈哈")));
}
}
3 DJBHash
/* 【算法】DJBHash(目前公布最有效的Hash算法)
* 【说明】俗称"Times33"算法
* */
public class DJBHash {
//DJBHash算法
static long DJB_Hash(String str){
long hash=5381;
for(int i=0;i<str.length();i++){
hash=((hash<<5)+hash)+str.charAt(i);
//System.out.println(hash);
}
return (hash & 0x7FFFFFFF);//32位
//return (hash & 0x7FFFFFFFFFFFFFFFL);//64位
}
//主函数
public static void main(String[] args) {
System.out.println(Long.toBinaryString(DJB_Hash("哈哈哈")));
}
}
4 JSHash
/* 【算法】JSHash(由Justin Sobel发明的一种hash算法)
* 【说明】位操作
* */
public class JSHash {
//JSHash算法
static long JS_Hash(String str){
long hash=1315423911;
for(int i=0;i<str.length();i++){
hash ^= ((hash << 5) + str.charAt(i) + (hash >> 2));
//System.out.println(hash);
}
return (hash & 0x7FFFFFFF);//32位
//return (hash & 0x7FFFFFFFFFFFFFFFL);//64位
}
//主函数
public static void main(String[] args) {
System.out.println(Long.toBinaryString(JS_Hash("哈哈哈")));
}
}
5 SDBMHash
/* 【算法】SDBMHash
* 【说明】与BKDRHash思想一致,只是数乘因子不同
* */
public class SDBMHash {
//SDBMHash算法
static long SDBM_Hash(String str){
long hash=0;
for(int i=0;i<str.length();i++){
hash=hash*65599+str.charAt(i);
//hash=str.charAt(i)+(hash<<6)+(hash<<16)-hash;
//System.out.println(hash);
}
return (hash & 0x7FFFFFFF);//32位
//return (hash & 0x7FFFFFFFFFFFFFFFL);//64位
}
//主函数
public static void main(String[] args) {
System.out.println(Long.toBinaryString(SDBM_Hash("哈哈")));
}
}
参考
https://www.cnblogs.com/qijunhui/p/8445484.html
https://www.cnblogs.com/wanghetao/p/4658471.html