我已经在java(jedis和guava)、go和python中尝试了三个版本的murmurhash。java(guava)、go和python版本的结果输出相同的哈希码,但与java(jedis)不同。所有 murmurhash 代码如下所示。我对结果感到困惑。我已经看到这个问题并Long.reverseBytes在java中使用,但仍然与其他问题不同。那么我应该怎么做才能使 murmurhash 的所有输出保持相同。谢谢~1.java版本(jedis)java gradlecompile 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));输出:-706392247917695964968977581074798324772.golang版本import "github.com/spaolacci/murmur3"foo := int64(murmur3.Sum64WithSeed([]byte("foo"), 0x1234ABCD))fmt.Println(foo)输出:-58512003251894006363.python版本pip install mmh3import mmh3foo = mmh3.hash64('foo', seed=0x1234ABCD, signed=True)print(foo)输出:-58512003251894006364. java(番石榴)java gradlecompile group: 'com.google.guava', name: 'guava', version: '28.0-jre'import com.google.common.hash.Hashinglong foo = Hashing.murmur3_128(0x1234ABCD).hashString("foo", charset.forName("UTF-8")).asLong();System.out.println(foo);输出:-5851200325189400636
1 回答
慕慕森
TA贡献1856条经验 获得超17个赞
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: 6897758107479832477
- 1 回答
- 0 关注
- 128 浏览
添加回答
举报
0/150
提交
取消