【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 }
分类:
算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律