2015-04-29 150 views
1

我有兩個不同的程序,希望分別使用Murmur3在Python和Java中哈希相同的字符串。Murmur3哈希在Python和Java實現之間的不同結果

Python版本2.7.9:

mmh3.hash128('abc') 

給出79267961763742113019008347020647561319L。

Java是番石榴18.0:

HashCode hashCode = Hashing.murmur3_128().newHasher().putString("abc", StandardCharsets.UTF_8).hash(); 

給出字符串 「6778ad3f3f3f96b4522dca264174a23b」,轉換爲BigInterger給137537073056680613988840834069010096699.

如何從都得到同樣的結果?

感謝

回答

5

下面是如何從獲得相同的結果:

byte[] mm3_le = Hashing.murmur3_128().hashString("abc", UTF_8).asBytes(); 
byte[] mm3_be = Bytes.toArray(Lists.reverse(Bytes.asList(mm3_le))); 
assertEquals("79267961763742113019008347020647561319", 
    new BigInteger(mm3_be).toString()); 

的哈希代碼的字節需要被視爲小尾數BigInteger解釋字節大端。您大概使用new BigInteger(hex, 16)來創建BigInteger,但HashCode.toString()的輸出實際上是一系列的十六進制數字對,它們以asBytes()(小端)返回的相同順序表示散列字節。 (您也可以反轉這些十六進制對以得到一個十六進制數,在傳遞到new BigInteger(reversedHex, 16)時產生相同的結果)。

我認爲toString()的文檔有點混淆,因爲它指的是「big endian」。它實際上並不意味着該方法的輸出是表示被解釋爲大端的字節的十六進制數字。

我們有一個開放的issue用於將asBigInteger()添加到HashCode