我看到了Hashable
变量hashValue
的几个实现示例,例如:
extension Country: Hashable {
var hashValue: Int {
return name.hashValue ^ capital.hashValue ^ visited.hashValue
}
}
var hashValue: Int {
return self.scalarArray.reduce(5381) {
($0 << 5) &+ $0 &+ Int($1)
}
}
var hashValue : Int {
get {
return String(self.scalarArray.map { UnicodeScalar($0) }).hashValue
}
}
等等。
在某些情况下,会使用OR
,XOR
或BITWISE
个运算符。在其他情况下,其他算法,映射或过滤功能等。
现在我有点困惑。计算好hashValue的经验法则是什么?
在最简单的情况下,有两个字符串变量,我应该将它们与OR运算符组合吗?
答案 0 :(得分:0)
在Swift 4.2中,您可以使用Hasher
Swift 4.2基于的SipHash系列实现散列 伪随机函数,特别是SipHash-1-3和SipHash-2-4,具有 每个消息块1或2轮哈希,以及3或4轮哈希 分别完成。
现在,如果您要自定义类型实现Hashable的方式,则可以 可以覆盖hash(into :)方法而不是hashValue。的 hash(into :)方法通过引用传递一个Hasher对象,您称之为 结合使用(_ :)可以添加您类型的基本状态信息。
// Swift >= 4.2
struct Color: Hashable {
let red: UInt8
let green: UInt8
let blue: UInt8
// Synthesized by compiler
func hash(into hasher: inout Hasher) {
hasher.combine(self.red)
hasher.combine(self.green)
hasher.combine(self.blue)
}
// Default implementation from protocol extension
var hashValue: Int {
var hasher = Hasher()
self.hash(into: &hasher)
return hasher.finalize()
}
}