首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从MurmurHash迁移到MurmurHash3

从MurmurHash迁移到MurmurHash3
EN

Stack Overflow用户
提问于 2013-02-10 20:01:25
回答 2查看 2.9K关注 0票数 7

在Scala2.10中,由于某种原因,MurmurHash被弃用,我说我现在应该使用MurmurHash3。但是应用编程接口是不同的,并且没有用于MurmurHash3 -> fail的有用的scaladoc。

例如,当前代码:

代码语言:javascript
复制
trait Foo {
  type Bar
  def id: Int
  def path: Bar

  override def hashCode = {
    import util.MurmurHash._
    var h = startHash(2)
    val c = startMagicA
    val k = startMagicB
    h = extendHash(h, id, c, k)
    h = extendHash(h, path.##, nextMagicA(c), nextMagicB(k))
    finalizeHash(h)
  }
}

我该如何使用MurmurHash3来实现这一点呢?这需要一个快速的操作,最好没有分配,所以我不想构造一个ProductSeqArray[Byte]MurmurHash3似乎提供给我的任何东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-10 20:56:21

令人困惑的是,MurmurHash3 algorithm从一个本质上混合了自己的盐的算法(ck)变成了一个只做更多比特混合的算法。基本的操作现在是mix,您应该将其叠加在所有值上,之后您应该finalizeHash (长度的Int参数也是为了方便,以帮助区分不同长度的集合)。如果你想用mixLast替换你的上一个mix,它会更快一点,并且用finalizeHash去掉冗余。如果你花了太长的时间来检测最后的混音是什么,那就用mix

通常,对于一个集合,您需要混入一个额外的值来指示它是什么类型的集合。

所以在最低限度上你会有

代码语言:javascript
复制
override def hashCode = finalizeHash(mixLast(id, path.##), 0)

并且“通常”你会

代码语言:javascript
复制
// Pick any string or number that suits you, put in companion object
val fooSeed = MurmurHash3.stringHash("classOf[Foo]")   

// I guess "id" plus "path" is two things?
override def hashCode = finalizeHash(mixLast( mix(fooSeed,id), path.## ), 2)

请注意,长度字段并不是为了提供混合了该数字的高质量散列。所有重要散列值的混合都应该使用mix完成。

票数 7
EN

Stack Overflow用户

发布于 2013-02-10 20:20:44

查看MurmurHash3的source code可以得到类似下面这样的提示:

代码语言:javascript
复制
override def hashCode = {
  import util.hashing.MurmurHash3._

  val h = symmetricSeed // I'm not sure which seed to use here
  val h1 = mix(h, id)
  val h2 = mixLast(h1, path ##)
  finalizeHash(h2, 2)
}

或者,在(几乎)一行中:

代码语言:javascript
复制
import util.hashing.MurmurHash3._
override def hashCode = finalizeHash(mix(mix(symmetricSeed, id), path ##), 2)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14797505

复制
相关文章

相似问题

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