onm*_*133 3 set hashable swift
我在读Set
当您需要有效地测试成员资格并且不关心集合中元素的顺序,或者需要确保每个元素在集合中只出现一次时,可以使用集合而不是数组.
基本上Set确保了独特性,它有一些方法和依赖Hashable
使用contains(_ :)方法测试集合是否包含特定元素.
使用减法(_ :)方法创建一个新集合,其中集合的元素不在另一个集合或序列中
但是2个不同的对象可以有相同的hashValue,就像在这篇文章Swift Hashable中一样
不要假设具有相同散列值的类型的两个实例相等.根据我们计算哈希值的方式,我们可以获得两个不同实例共享相同哈希值的冲突.Hashable协议只需要反向 - 两个相等的实例具有相同的哈希值.
那么,如果两个对象具有相同hashValue,并且Set只保存1,那么我们有问题呢?
符合的对象也Hashable必须是Equatable. Set用于==测试相等性,它不仅仅依赖于hashValue.
来自Apple关于Hashable的文档:
符合Hashable协议
要在集合中使用您自己的自定义类型或作为字典的键类型,请通过提供hashValue属性为您的类型添加Hashable一致性.Hashable协议继承自Equatable协议,因此您还必须为自定义类型添加等于运算符(==)的函数.
文档继续说:
设置和字典性能取决于散列值,这些散列值分别最小化其关联元素和键类型的冲突.
所以,hashValue它只是用于第一次测试的唯一性; 如果hashValues匹配Set则将使用更昂贵的计算==来测试唯一性.