从MurmurHash迁移到MurmurHash3

0__*_*0__ 7 hash scala murmurhash

在Scala 2.10中,MurmurHash由于某种原因被弃用,说我MurmurHash3现在应该使用.但是API是不同的,并且没有有用的scaladoc用于MurmurHash3- >失败.

例如,当前代码:

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

我该如何使用MurmurHash3呢?这需要一个快速的操作,最好不分配,所以我不希望建立一个Product,Seq,Array[Byte]或whathever MurmurHash3似乎为我提供.

Rex*_*err 7

所述MurmurHash3算法被改变,容易混淆的,从一种算法,在其自己的盐混合,基本上由(ck),以一个只是没有更多的比特混合.现在基本操作mix,你应该折叠你的所有值,之后你应该finalizeHash(Int长度的参数也是为了方便,以帮助区分不同长度的集合).如果你希望你的最后更换mixmixLast,这是一个快一点,并消除冗余finalizeHash.如果您需要花费太长时间才能检测出最后一个混音是什么,只需mix.

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

你所拥有的最低限度

override def hashCode = finalizeHash(mixLast(id, path.##), 0)
Run Code Online (Sandbox Code Playgroud)

并且"通常"你

// 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)
Run Code Online (Sandbox Code Playgroud)

请注意,长度字段不是为了提供混合在该数字中的高质量哈希.应该使用重要哈希值的所有混合mix.