请解释使用可散列协议并在 swift 中实现。Apple 将 hashable 定义为“一种提供整数和哈希值的类型”。好的,但是什么是哈希值?
4 回答
为了使对象符合 Hashable,我们需要提供一个 hashValue 属性,该属性将为每个实例返回一个唯一的、一致的数字。Hashable 协议继承自 Equatable,因此您可能还需要实现 == 函数。
注意:如果两个对象使用 == 比较相等,它们也应该生成相同的哈希值,但反之则不然——可能会发生哈希冲突。
在 Swift 4.1 之前,遵守 Hashable 很复杂,因为您需要手动计算 hashValue 属性。在 Swift 4.1 中,这一点得到了改进,如果所有属性都符合 Hashable ,则可以代表您合成 hashValue 。Swift 4.2 引入了一个新的 Hasher 结构,它提供了一个随机播种的通用哈希函数,让我们的生活更轻松。参考更多
快速回答:
我们在对象中使用哈希整数,以便能够通过获取我们正在寻找的索引前面的对象实例来快速识别相等的对象。
不快回答:
当您处理列表以查找对象时,您需要遍历所有数组并比较属性以找到您要查找的对象,随着列表变大,这可能会降低您的应用程序的速度。
当您使用 SET 时,引擎盖下的机制使用哈希索引来查找对象,因此您只需花时间计算您要查找的索引,然后您就可以直接访问您的对象,这太酷了. 从 Swift 4.1 开始,为了使用 SET,对象需要符合 Hashable 协议,如果你的类或结构和所有属性都符合 Hashable,那么在后台自动为你完成对 Hashable 和 Equatable 协议的符合性。如果您不满足这些要求,则必须确保符合 Equatable 和 Hashable 协议。
Equatable 协议需要覆盖 static func ==(..)以便比较您的对象。
Hashable 协议需要尽可能地提供一个唯一的整数值 hashValue,当它们相等时,它们在两个对象中必须相同。希望这有帮助
如果一个对象符合hashable
协议,它需要有一个hashValue
,正如你提到的。可hashValue
用于比较对象/唯一标识对象。
您可以通过两种方式比较对象:
===
功能。这会检查对象引用(只能与类一起使用)。它检查左对象是否具有对右对象的相同引用。即使两个对象具有完全相同的属性值但它们确实具有不同的引用,它也会返回 false。==
功能(Equatable
协议)。它基于静态函数检查对象是否相等==
。您可以返回hashValue
对象的。这样,您可以根据属性而不是引用说对象彼此相等。
如果您提供自己的hashValue
,则可以说对象彼此相等,就像您说对象彼此相等,而不管对对象的引用如何。您可以在Set
符合哈希协议的 a 中使用对象,因为 aSet
检查对象是否基于hashValue
.
Hashable文档给出了一个具体的例子来说明它的用途:
您可以在集合中使用任何符合 Hashable 协议的类型或作为字典键。
您可以将哈希值视为相等的快速近似值。相等的两个元素将具有相同的哈希值,但不能保证具有相同哈希值的两个元素实际上是相等的。