Set如何确保Swift中的等价性?
问题描述:
使用一组数组,而不是当你需要有效地测试成员和你不关心元素的集合,或在订单时,你需要确保每个元素在集合中只出现一次。
基本上Set
确保唯一,它有一些方法和依赖于Hashable
使用含有(_ :)方法来测试一组是否包含特定元素。
使用减法(_ :)方法来创建一个新的集合与不是也在另一组或序列的集合中的元素
但2个不同的对象可以有相同的hashValue
,像这篇文章Swift Hashable
不要假定具有相同散列值的类型的两个实例是相等的。根据我们计算散列值的方式,我们可以得到两个不同实例共享相同散列值的冲突。 Hashable协议只需要反向 - 两个相等的实例具有相同的散列值。
那么,如果两个对象具有相同的hashValue
,并Set
不仅节省了1,那么我们有什么问题?
答
符合Hashable
的对象也必须是Equatable
。 Set
使用==
来测试是否相等,它不仅仅取决于hashValue
。
从苹果公司的文件上Hashable:
符合哈希的协议
要在 组或作为字典的密钥类型使用自己的自定义类型,哈希的符合添加到 您通过提供一个hashValue属性来键入。 Hashable协议 继承自Equatable协议,因此您还必须为您的自定义类型添加等于 运算符(==)的函数。
的文件接着说:
集和字典的性能取决于哈希值分别减少 碰撞对他们相关的元素和主要类型。
因此,hashValue
只是第一次测试的唯一性;如果hashValue
匹配,则Set
将使用计算上更昂贵的==
来测试唯一性。
该文档没有声明只保存具有不同hashValue的项目。 –
“那么如果2个对象具有相同的散列值,而Set仅保存1,那么我们有问题?” 编号设置将存储2个对象。这种情况称为散列冲突,Set将处理该情况。 –