swift 中集合类型的哈希值是什么?

0 hash set swift

当我阅读 swift 文档时,我无法理解这是什么意思?\n类型必须是可哈希的才能存储在集合\xe2\x80\x94中,也就是说,该类型必须提供一种计算自身哈希值的方法。哈希值是一个 Int 值,对于所有同等比较的对象来说都是相同的,因此如果 a == b,则得出 a.hashValue == b.hashValue。

\n

vac*_*ama 5

Set专为性能而设计。该contains(_:)方法的Set复杂度为 O(1),这意味着无论集合的大小,执行都需要恒定的时间。 contains(_:)其复杂度Array为 O(n),这意味着确定数组是否包含元素的时间随着数组大小的增加而增加。

a 是如何Set做到这一点的?它使用 ahashValue表示 的项目Set,并包含一个类似于内部字典的结构,该结构将 映射hashValue到带有 that 的项目列表hashValue。这使得测试复杂结构(例如String)的相等性非常快,因为Set首先测试两个值是否具有相同的hashValue。如果hashValues 不同,则不需要检查structs 本身的内容。

要测试 aSet contains值是否存在,只需hashValue在字典中查找 a ,然后将该项与匹配的值进行比较。

因此,对于要包含在 a 中的项目Set,提供一个哈希函数非常重要:

  1. 如果两个结构/对象相等,则相同。(绝对要求
  2. 计算广泛的范围,hashValues以便项目广泛分布,并且不需要回退到较慢的相等性检查。(为了获得良好的性能

Hashable struct以下是适合存储在 a 中的a 的示例Set

struct Option: Hashable, CustomStringConvertible {
    var title: String
    var key: String
    var value: Int
    var description: String { return "{title: \"\(title)\", key: \"\(key)\", value: \(value)}" }

    func hash(into hasher: inout Hasher) {
        hasher.combine(title)
        hasher.combine(key)
    }

    static func ==(lhs: Option, rhs: Option) -> Bool {
        return lhs.title == rhs.title && lhs.key == rhs.key
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:在此示例中,仅将titlekey属性视为相等。即使两个结构具有不同的属性,它们也可以相等value。该hash(into:)函数同样只考虑titlekey属性。