gpt4 book ai didi

java - 不同语言版本的Murmurhash会得到不同的结果

转载 作者:行者123 更新时间:2023-12-03 10:09:05 26 4
gpt4 key购买 nike

我已经在Java中尝试了murmurhash的三个版本(jedis和guava),go和python。 java(guava),go和python版本的结果输出相同的哈希码,但与java(jedis)不同。
所有杂音代码如下所示。我对结果感到困惑。我已经看过这个issue并在Java中使用了Long.reverseBytes,但与其他代码仍然有所不同。因此,我应该怎么做才能使murmurhash的所有输出保持不变。谢谢〜

1. Java版本(jedis)

java gradle 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

6897758107479832477

2. golang版本

import "github.com/spaolacci/murmur3"

foo := int64(murmur3.Sum64WithSeed([]byte("foo"), 0x1234ABCD))
fmt.Println(foo)

输出:
-5851200325189400636

3. python版本
pip install mmh3
import mmh3

foo = mmh3.hash64('foo', seed=0x1234ABCD, signed=True)
print(foo)


输出:
-5851200325189400636

4. java(guava)

java gradle 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

最佳答案

TL; DR
Jedis使用Murmur2,而其他库使用Murmur3。

在将某些代码从Java/Jedis迁移到Golang时,我也很喜欢。
差异是由于杂音的版本不同。
到目前为止,Jedis使用Murmur2(请参阅source codedocumentation),而上述其他库使用Murmur3。
除了查看注释/代码,我还使用了Murmur2 reference implementation对此进行了验证。使用相同的种子和 key 可以得到与您的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

关于java - 不同语言版本的Murmurhash会得到不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57621707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com