加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

斯卡拉 – 从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进行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读