【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