前言
主要介紹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 }