gpt4 book ai didi

scala - 从 MurmurHash 迁移到 MurmurHash3

转载 作者:行者123 更新时间:2023-12-03 03:48:53 24 4
gpt4 key购买 nike

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

例如,当前代码:

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 来做到这一点?这需要是一个快速操作,最好没有分配,所以我不想构造 ProductSeqArray[Byte] 或无论 MurmurHash3 似乎向我提供了什么。

最佳答案

MurmurHash3 algorithm令人困惑的是,它从一种混合了自己的盐的算法,本质上是(ck),变成了一种只进行更多位混合的算法。现在的基本操作是 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 完成。

关于scala - 从 MurmurHash 迁移到 MurmurHash3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14797505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com