我正在尝试使用Murmur3算法生成哈希值。这些哈希值是一致的,但是Scala和Guava返回的值不同。
class package$Test extends FunSuite {
test("Generate hashes") {
println(s"Seed = ${MurmurHash3.stringSeed}")
val vs = Set("abc", "test", "bucket", 111.toString)
vs.foreach { x =>
println(s"[SCALA] Hash for $x = ${MurmurHash3.stringHash(x).abs % 1000}")
println(s"[GUAVA] Hash for $x = ${Hashing.murmur3_32().hashString(x).asInt().abs % 1000}")
println(s"[GUAVA with seed] Hash for $x = ${Hashing.murmur3_32(MurmurHash3.stringSeed).hashString(x).asInt().abs % 1000}")
println()
}
}
}
Seed = -137723950
[SCALA] Hash for abc = 174
[GUAVA] Hash for abc = 419
[GUAVA with seed] Hash for abc = 195
[SCALA] Hash for test = 588
[GUAVA] Hash for test = 292
[GUAVA with seed] Hash for test = 714
[SCALA] Hash for bucket = 413
[GUAVA] Hash for bucket = 22
[GUAVA with seed] Hash for bucket = 414
[SCALA] Hash for 111 = 250
[GUAVA] Hash for 111 = 317
[GUAVA with seed] Hash for 111 = 958
我为什么会得到不同的哈希值?
char
放入LITTLE_ENDIAN ByteBuffer
中并获取一个int
。与此同时,Scala版本似乎相当于将2个char
放入BIG_ENDIAN ByteBuffer
中并获取一个int
。从我所知道的情况来看,Scala传递给finalizeHash
的字符数而不是字节数似乎是错误的。 - ColinDlen
参数是要处理的数据字节数,而在最终化步骤中,正是将len
与h1
进行异或运算。 - ColinD