Set如何确保Swift中的等价性?

问题描述:

我读SetSet如何确保Swift中的等价性?

使用一组数组,而不是当你需要有效地测试成员和你不关心元素的集合,或在订单时,你需要确保每个元素在集合中只出现一次。

基本上Set确保唯一,它有一些方法和依赖于Hashable

使用含有(_ :)方法来测试一组是否包含特定元素。

使用减法(_ :)方法来创建一个新的集合与不是也在另一组或序列的集合中的元素

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

不要假定具有相同散列值的类型的两个实例是相等的。根据我们计算散列值的方式,我们可以得到两个不同实例共享相同散列值的冲突。 Hashable协议只需要反向 - 两个相等的实例具有相同的散列值。

那么,如果两个对象具有相同的hashValue,并Set不仅节省了1,那么我们有什么问题?

+1

该文档没有声明只保存具​​有不同hashValue的项目。 –

+1

“那么如果2个对象具有相同的散列值,而Set仅保存1,那么我们有问题?” 编号设置将存储2个对象。这种情况称为散列冲突,Set将处理该情况。 –

符合Hashable的对象也必须是EquatableSet使用==来测试是否相等,它不仅仅取决于hashValue

从苹果公司的文件上Hashable

符合哈希的协议

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

的文件接着说:

集和字典的性能取决于哈希值分别减少 碰撞对他们相关的元素和主要类型。

因此,hashValue只是第一次测试的唯一性;如果hashValue匹配,则Set将使用计算上更昂贵的==来测试唯一性。