我在java(jedis和番石榴)、go和python中尝试了三个版本的murmurhash。java(番石榴)、go和python版本的结果输出相同的哈希代码,但与java(jedis)不同。所有的杂音码如下所示。我对结果很困惑。我已经看过这个问题,并在java中使用了Long.reverseBytes,但仍然与其他人不同。那么我该怎么做才能使杂音的所有输出保持不变。谢谢~
1. java版本(Jedis)
java级compile group: 'redis.clients', name: 'jedis', version: '3.1.0'
import redis.clients.jedis.util.MurmurHash;
MurmurHash murmurhash = new MurmurHash();
long h = murmurhash.hash("foo");
System.out.println(h);
System.out.println(Long.reverseBytes(h));输出:
-7063922479176959649
68977581074798324772. golang版本
import "github.com/spaolacci/murmur3"
foo := int64(murmur3.Sum64WithSeed([]byte("foo"), 0x1234ABCD))
fmt.Println(foo)输出:
-58512003251894006363. python版本
pip install mmh3
import mmh3
foo = mmh3.hash64('foo', seed=0x1234ABCD, signed=True)
print(foo)输出:
-58512003251894006364. java(番石榴)
java级compile group: 'com.google.guava', name: 'guava', version: '28.0-jre'
import com.google.common.hash.Hashing
long foo = Hashing.murmur3_128(0x1234ABCD).hashString("foo", charset.forName("UTF-8")).asLong();
System.out.println(foo);输出:
-5851200325189400636发布于 2021-01-06 08:29:55
TL;博士
Jedis使用Murmur2,而其他库使用Murmur3。
在将一些代码从Java/Jedis迁移到Golang时,我也爱上了它。
这种差异是由于不同版本的杂音。到目前为止,Jedis使用的是Murmur2 (参见源代码和文档),而上面提到的其他库使用Murmur3。
除了查看注释/代码之外,我还使用Murmur2参考实现验证了这一点。使用相同的种子和键可以得到与您的Jedis示例完全相同的结果。
代码片段:
const char *key = "foo";
uint64_t result = MurmurHash64A(key, std::strlen(key), 0x1234ABCD);
std::cout << " result (unsigned): " << result << std::endl;
std::cout << " result (signed): " << (long) result << std::endl;
std::cout << "reversed byte order: " << __builtin_bswap64(result) << std::endl;输出:
result (unsigned): 11382821594532591967
result (signed): -7063922479176959649
reversed byte order: 6897758107479832477https://stackoverflow.com/questions/57621707
复制相似问题