swift4中可哈希协议的用途是什么?

时间:2018-08-24 08:25:13

标签: swift protocols hashable

请解释一下可散列协议在快速实现中的使用。 Apple将hashable定义为“一种为整数提供哈希值的类型。”好的,但是什么是哈希值?

4 个答案:

答案 0 :(得分:3)

要使对象符合Hashable,我们需要提供一个hashValue属性,该属性将为每个实例返回唯一的一致编号。 Hashable协议继承自Equatable,因此您可能还需要实现==函数。

注意:如果两个对象使用==比较相等,则它们也应生成相同的哈希值,但事实并非如此-哈希冲突可能发生。

在Swift 4.1之前,遵循Hashable的操作很复杂,因为您需要手动计算hashValue属性。 在Swift 4.1中,此功能得到了改进,因此,如果所有属性都符合Hashable,则可以代表您合成hashValue。 Swift 4.2引入了新的Hasher结构,该结构提供了随机种子的通用哈希函数,使我们的生活更轻松。 Refer for more

答案 1 :(得分:1)

如前所述,如果对象符合hashable协议,则它必须具有hashValuehashValue可用于比较对象/唯一标识对象。

您可以通过两种方式比较对象:

  1. ===函数。这将检查对象引用(只能与类一起使用)。它检查左侧对象是否与右侧对象具有相同的引用。即使两个对象都具有完全相同的属性值,但它们确实具有不同的引用,它也会返回false。

  2. ==功能(Equatable协议)。它根据静态函数==检查对象是否彼此相等。您可以返回对象的hashValue。这样,您可以基于属性而不是引用来说对象彼此相等。

如果您提供自己的hashValue,则可以说对象彼此相等,而无论引用对象如何。您可以在Set中使用符合可哈希协议的对象,因为Set会根据hashValue检查对象是否彼此相等。

答案 2 :(得分:0)

Hashable documentation给出了一个具体的示例:

  

您可以在集合中或字典词典中使用符合Hashable协议的任何类型。

您可以将哈希值视为相等的快速近似。两个相等的元素将具有相同的哈希值,但不能保证两个具有相同哈希值的元素实际上是相等的。

答案 3 :(得分:0)

快速解答:

我们将哈希整数用于对象,以便通过将对象实例置于要查找的索引的前面来快速识别相等的对象。

不是快速答案:

处理列表以查找对象时,需要遍历所有数组并比较属性以查找所需的对象,这可能会使应用程序的运行速度变慢变得更大。

使用SET时,内部机制使用哈希索引来查找对象,因此仅需花费时间即可计算出所要查找的索引,然后就可以直接访问您的对象,这太酷了。 为了使用SET,自Swift 4.1起,该对象需要符合Hashable协议,如果您的类或结构以及所有属性均符合Hashable,则将在后台自动为您实现与Hashable和Equatable协议的符合性。 如果您不满足这些要求,则必须确保符合Equatable和Hashable协议。

平等协议需要覆盖静态函数==(..),以便比较您的对象。

哈希协议需要尽可能地提供唯一的整数值hashValue ,当两个对象相等时,它们必须在两个对象中相同。 希望有帮助