斯卡拉 – 从MurmurHash迁移到MurmurHash3
发布时间:2020-12-16 19:18:03 所属栏目:安全 来源:网络整理
导读:在 Scala 2.10中,MurmurHash出于某种原因被弃用,说我现在应该使用MurmurHash3.但是API是不同的,并且MurmurHash3没有有用的标量 – 失败. 例如,当前代码: trait Foo { type Bar def id: Int def path: Bar override def hashCode = { import util.MurmurHash
在
Scala 2.10中,MurmurHash出于某种原因被弃用,说我现在应该使用MurmurHash3.但是API是不同的,并且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) } } 我将如何使用MurmurHash3来做到这一点?这需要一个快速的操作,最好没有分配,所以我不想构建一个Product,Seq,Array [Byte]或者MurmurHash3似乎在提供给我. 解决方法
MurmurHash3 algorithm被混淆了,从一个混合在自己的盐中的算法,基本上是(c和k)到一个只是做更多比特混合的算法.基本操作现在是mix,你应该折叠你的所有值,之后你应该finalizeHash(长度的Int参数也是为了方便,以帮助区分不同长度的集合).如果你想用mixLast替换你的最后一个混音,它会更快一些,并通过finalizeHash消除冗余.如果您需要花费太长时间才能检测到最后一种混合物,只需混合即可.
通常,对于集合,您需要混合使用额外的值来指示它是什么类型的集合. 你所拥有的最低限度 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进行. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |