6

我在读

当您需要有效地测试成员资格并且您不关心集合中元素的顺序,或者当您需要确保每个元素在集合中只出现一次时,您可以使用集合而不是数组。

基本Set保证唯一性,有一些方法,依赖Hashable

使用 contains(_:) 方法测试集合是否包含特定元素。

使用减法(_:) 方法创建一个新集合,其中包含一个集合中不在另一个集合或序列中的元素

但是 2 个不同的对象可以有相同的hashValue,就像这篇文章Swift Hashable

不要假设具有相同哈希值的类型的两个实例是相等的。根据我们计算哈希值的方式,我们可能会遇到两个不同实例共享相同哈希值的冲突。Hashable 协议只需要反过来——两个相等的实例具有相同的哈希值。

那么如果 2 个对象具有相同的hashValue,并且Set只保存 1 个,那么我们有问题吗?

4

1 回答 1

12

符合的对象也Hashable必须是EquatableSet用于==测试是否相等,它不仅仅依赖于hashValue.

来自 Apple 关于Hashable的文档:

符合 Hashable 协议

要在集合中使用您自己的自定义类型或作为字典的键类型,请通过提供 hashValue 属性将 Hashable 一致性添加到您的类型。Hashable 协议继承自 Equatable 协议,因此您还必须为您的自定义类型添加一个等于运算符 (==) 函数。

文档接着说:

集合和字典的性能取决于散列值,该散列值分别最小化其关联元素和键类型的冲突。

因此,hashValue只是用于唯一性的第一个测试;如果hashValues 匹配,那么Set将使用计算成本更高==的来测试唯一性。

于 2017-07-03T11:11:10.397 回答