几种常见的hash算法

原文链接: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

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值