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似乎为我提供.
所述MurmurHash3算法被改变,容易混淆的,从一种算法,在其自己的盐混合,基本上由(c和k),以一个只是没有更多的比特混合.现在基本操作mix,你应该折叠你的所有值,之后你应该finalizeHash(Int长度的参数也是为了方便,以帮助区分不同长度的集合).如果你希望你的最后更换mix的mixLast,这是一个快一点,并消除冗余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.
| 归档时间: |
|
| 查看次数: |
2709 次 |
| 最近记录: |