Python和Java实现之间的哈希结果不同

Python和Java实现之间的哈希结果不同,java,python,guava,murmurhash,Java,Python,Guava,Murmurhash,我有两个不同的程序,分别在Python和Java中使用Murruld3对同一字符串进行散列 Python 2.7.9版: mmh3.hash128('abc')) 给出79267961763742113019008347020647561319L Java是Guava 18.0: HashCode HashCode=Hashing.murru3_128().newHasher().putString(“abc”,StandardCharsets.UTF_8).hash(); 给出字符串“67

我有两个不同的程序,分别在Python和Java中使用Murruld3对同一字符串进行散列

Python 2.7.9版:

mmh3.hash128('abc'))
给出79267961763742113019008347020647561319L

Java是Guava 18.0:

HashCode HashCode=Hashing.murru3_128().newHasher().putString(“abc”,StandardCharsets.UTF_8).hash();
给出字符串“6778AD3F3F96B4522DCA264174A23B”,转换为BigInteger给出137537073056680613988840834069010096699

如何从两者中获得相同的结果


谢谢

以下是如何从两者中获得相同的结果:

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());
哈希代码的字节需要被视为小尾数,但
biginger
将字节解释为大尾数。您可能使用了
new biginger(hex,16)
来创建
biginger
,但是
HashCode.toString()
的输出实际上是一系列十六进制数字对,它们以
asBytes()
返回的相同顺序表示哈希字节。(您还可以反转这些十六进制数对,以获得一个十六进制数,该十六进制数在传递给
新的BigInteger(reversedHex,16)
时会产生相同的结果)

我认为
toString()
的文档有点混乱,因为它引用“big-endian”的方式;实际上,这并不意味着该方法的输出是十六进制数,表示被解释为big-endian的字节


如果有人对反向答案感兴趣,我们可以将
asbiginger()
添加到
HashCode
,将python输出转换为Java输出:

import mmh3
import string

char_array = '0123456789abcdef'
mumrmur = mmh3.hash_bytes('abc')

result = [f'{string.hexdigits[(char >> 4) & 0xf]}{string.hexdigits[char & 0xf]}' for char in mumrmur]
print(''.join(result))