Python和Java实现之间的杂音散列结果不同

2024-09-30 06:13:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个不同的程序,希望分别使用Python和Java中的hurry3散列同一个字符串。在

Python 2.7.9版:

mmh3.hash128('abc')

提供79267961763742113019008347020647561319L

Java是Guava 18.0:

^{pr2}$

给出字符串“6778AD3F3F3F96B4522DCA2644174A23B”,转换为BigInterger得到137537073056680613988840834069010096699。在

如何从两者中得到相同的结果?在

谢谢


Tags: 字符串程序javaguavaabcmmh3pr2hurry3
2条回答

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

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());

哈希代码的字节需要被视为little-endian,但是BigInteger将字节解释为big-endian。您大概是在使用new BigInteger(hex, 16)来创建BigInteger,但{}的输出实际上是一系列十六进制数字对,表示哈希字节,其顺序与{}(little endian)返回的顺序相同。(您还可以反转这些十六进制对,以获得一个十六进制数,当传递给new BigInteger(reversedHex, 16)时,该十六进制数确实会产生相同的结果)。在

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

我们有一个开放的issue,用于将asBigInteger()添加到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))

相关问题 更多 >

    热门问题