首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >斯卡拉和番石榴Murmur3的不同结果

斯卡拉和番石榴Murmur3的不同结果
EN

Stack Overflow用户
提问于 2015-05-12 16:13:20
回答 2查看 1.7K关注 0票数 4

我正在尝试使用Murmur3算法生成散列。散列是一致的,但它们是Scala和Guava返回的不同值。

代码语言:javascript
复制
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

为什么我会得到不同的哈希?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-12 16:43:08

在我看来,Scala的hashString将UTF-16 chars转换成与番石榴的hashUnencodedChars不同的UTF-16hashUnencodedChars(没有CharsethashString被重命名为hashUnencodedChars)。

Scala:

代码语言:javascript
复制
val data = (str.charAt(i) << 16) + str.charAt(i + 1)

番石榴:

代码语言:javascript
复制
int k1 = input.charAt(i - 1) | (input.charAt(i) << 16);

在番石榴中,索引char中的i成为int中最不重要的16位,而i + 1上的char则成为最重要的16位。在Scala实现中,情况正好相反:char at i是最重要的,而char at i + 1是最不重要的。(我认为Scala实现使用+而不是|也很重要。)

请注意,番石榴实现相当于两次使用ByteBuffer.putChar(c)将两个字符放入一个小的endian ByteBuffer中,然后使用ByteBuffer.getInt()返回一个int值。番石榴实现还相当于使用UTF-16LE将字符编码为字节并对这些字节进行散列。Scala实现不等同于在JVM需要支持的任何标准字符集中编码字符串。一般来说,我不确定Scala有什么先例(如果有的话)。

编辑:

Scala实现还做了与Guava实现不同的事情:它将散列的字符数传递给finalizeHash方法,其中Guava的实现将字节数传递给等效的fmix方法。

票数 4
EN

Stack Overflow用户

发布于 2015-05-12 17:00:52

我认为hashString(x, StandardCharsets.UTF_16BE)应该与Scala的行为相匹配。让我们知道。

(另外,请把番石榴升级到新的!)

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30196298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档