【MurmurHash】Murmur哈希算法


前言

  主要介绍MurmurHash算法的特点,以及在业务中的使用场景

介绍

  参考百度

  Murmur哈希是一种非加密散列函数,适用于一般的基于散列的查找。它在2008年由Austin Appleby创建,在Github上托管,名为“SMHasher” 的测试套件。 它也存在许多变种,所有这些变种都已经被公开。 该名称来自两个基本操作,乘法(MU)和旋转(R),在其内部循环中使用。

与加密散列函数不同,它不是专门设计为难以被对手逆转,因此 不适用于加密目的。 
 

适用场景

  和加密散列函数例如:MD5,SHA256等不同,由于MurmurHash算法的特性不适用在信息被加密的场景下,考虑到MurmurHash算法的特点
  项目中可以使用的场景有以下特点即
  1.要求随机分布特征表现好,不容易被猜测,例如相比于自增ID,出于安全考虑,不会暴露增长量等相关敏感的业务;
  2.生成性能要好(该算法的性能强于MD5);
  3.函数产生的数据量大  MurmurHash2(产⽣32位或64位值),MurmurHash3(产⽣32位或128位值),MurmurHash的 32 bit 能表示的最⼤值近 43 亿的10进制;
 
  例如,在短链生成下,MurmurHash这里比较好的适用于该场景
 

示例代码

  例如在短链生成的场景下,我们可以利用MurmurHash算法讲长连接转换为满足我们规则短链接
  这里适用google guava包中的封装的工具类的来做为MurmurHash算法的实现
  
    /**
     * murmurhash算法
     * @param param
     * @return
     */
    public static long murmurHash32(String param){
        long murmurHash32 = Hashing.murmur3_32().hashUnencodedChars(param).padToLong();
        return murmurHash32;
    }

  MurmurHash生成得到的是一个long类型的10进制数,通常我们为了缩短短链的位数,可以适用Base62将结果转换为62进制数

    /**
     * 10进制转62进制
     * @param num
     * @return
     */
    private static  String encodeToBase62(long num){

        // StringBuffer线程安全,StringBuilder线程不安全
        StringBuffer sb = new StringBuffer();
        do{
            int i = (int )(num%62);
            sb.append(CHARS.charAt(i));
            num = num/62;
        }while (num>0);

        String value = sb.reverse().toString();
        return value;

    }
    /**
     * 生成短链码
     * @param param
     * @return
     */
    public static String createShortLinkCode(String param){
        //获取MurmurHash的值
        long murmurhash = CommonUtil.murmurHash32(param);
        //进制转换
        String code = encodeToBase62(murmurhash);
        return code;
    }

    public static void main(String[] args) {
        String url="http://www.baidu.com/id=123456789&name=987654321";
        String shortLinkCode = createShortLinkCode(url);
        System.out.println(shortLinkCode);//4uy2GC
    }

  

 

  
 
  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM