在Scala2.10中,由于某种原因,MurmurHash被弃用,我说我现在应该使用MurmurHash3。但是应用编程接口是不同的,并且没有用于MurmurHash3 -> fail的有用的scaladoc。
例如,当前代码:
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来实现这一点呢?这需要一个快速的操作,最好没有分配,所以我不想构造一个Product、Seq、Array[Byte]或MurmurHash3似乎提供给我的任何东西。
发布于 2013-02-10 20:56:21
令人困惑的是,MurmurHash3 algorithm从一个本质上混合了自己的盐的算法(c和k)变成了一个只做更多比特混合的算法。基本的操作现在是mix,您应该将其叠加在所有值上,之后您应该finalizeHash (长度的Int参数也是为了方便,以帮助区分不同长度的集合)。如果你想用mixLast替换你的上一个mix,它会更快一点,并且用finalizeHash去掉冗余。如果你花了太长的时间来检测最后的混音是什么,那就用mix。
通常,对于一个集合,您需要混入一个额外的值来指示它是什么类型的集合。
所以在最低限度上你会有
override def hashCode = finalizeHash(mixLast(id, path.##), 0)并且“通常”你会
// 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完成。
发布于 2013-02-10 20:20:44
查看MurmurHash3的source code可以得到类似下面这样的提示:
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)
}或者,在(几乎)一行中:
import util.hashing.MurmurHash3._
override def hashCode = finalizeHash(mix(mix(symmetricSeed, id), path ##), 2)https://stackoverflow.com/questions/14797505
复制相似问题