【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
    }
复制代码

  

 

  
 
  
posted @   听风是雨  阅读(3702)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
/* 看板娘 */
点击右上角即可分享
微信分享提示