mic*_*liu 2 python java guava murmurhash
我有两个不同的程序,希望分别使用Python和Java中的Murmur3来散列相同的字符串.
Python版本2.7.9:
mmh3.hash128('abc')
Run Code Online (Sandbox Code Playgroud)
给79267961763742113019008347020647561319L.
Java是Guava 18.0:
HashCode hashCode = Hashing.murmur3_128().newHasher().putString("abc", StandardCharsets.UTF_8).hash();
Run Code Online (Sandbox Code Playgroud)
提供字符串"6778ad3f3f3f96b4522dca264174a23b",转换为BigInterger给出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());
Run Code Online (Sandbox Code Playgroud)
哈希码的字节需要被视为小端,但BigInteger将字节解释为大端.你可能new BigInteger(hex, 16)用来创建BigInteger,但输出HashCode.toString()实际上是一系列十六进制数字对,表示它们返回的相同顺序的哈希字节asBytes()(小端).(您也可以反转这些十六进制对,以获得一个十六进制数,传递给它时会产生相同的结果new BigInteger(reversedHex, 16)).
我认为文档toString()有点令人困惑,因为它指的是"大端"; 它实际上并不意味着该方法的输出是十六进制数,表示被解释为大端的字节.
我们有一个开放的问题,添加asBigInteger()到HashCode.
| 归档时间: |
|
| 查看次数: |
2352 次 |
| 最近记录: |