擅长:python、mysql、java
<p>以下是如何从两者中获得相同的结果:</p>
<pre><code>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());
</code></pre>
<p>哈希代码的字节需要被视为<em>little-endian</em>,但是<code>BigInteger</code>将字节解释为big-endian。您大概是在使用<code>new BigInteger(hex, 16)</code>来创建<code>BigInteger</code>,但{<cd4>}的输出实际上是一系列十六进制数字对,表示哈希字节,其顺序与{<cd5>}(little endian)返回的顺序相同。(您还可以反转这些十六进制对,以获得一个十六进制数,当传递给<code>new BigInteger(reversedHex, 16)</code>时,该十六进制数确实会产生相同的结果)。在</p>
<p>我认为<code>toString()</code>的文档有点混乱,因为它引用了“big-endian”;它实际上并不意味着方法的输出是十六进制数,表示被解释为big-endian的字节。在</p>
<p>我们有一个开放的<a href="https://github.com/google/guava/issues/1323">issue</a>,用于将<code>asBigInteger()</code>添加到<code>HashCode</code>。在</p>