我应该如何计算hashValue?

时间:2017-10-11 10:35:46

标签: swift hash

我看到了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
    }
}

等等。 在某些情况下,会使用ORXORBITWISE个运算符。在其他情况下,其他算法,映射或过滤功能等。

现在我有点困惑。计算好hashValue的经验法则是什么?

在最简单的情况下,有两个字符串变量,我应该将它们与OR运算符组合吗?

1 个答案:

答案 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()
    }
}