我知道Hashable继承自Equatable,但是你能给我一个需要Hashable的例子,而不仅仅是Equatable。谢谢!
答案 0 :(得分:4)
当您符合Hashable
时,您提供的方法会返回self
的哈希值。
当您符合Equatable
时,您提供的方法可以返回给定对象和self
是否相等。
它们似乎有两个截然不同的目的,为什么Hashable
会继承Equatable
?因为两个相等对象的哈希值相等!
使用Hashable
和Equatable
可以做什么,不能做什么?
Equatable
的用途比Hashable
更有限。它只能比较两个对象的相等性,就是这样。
对于Hashable
,因为你可以得到一个代表对象的数字,你可以将对象视为数字。您可以比较对象:它是否小于,大于或等于另一个对象,就像您对数字一样:
if objA.hashValue > objB.hashValue
这也意味着您可以使用Hashable
对对象进行排序。
最后但并非最不重要的是,您可以使用Hashable
个对象作为地图的键!这是因为地图的密钥不能复制,那么系统如何检查是否在其中放置了重复的项目?它使用键的哈希值!
答案 1 :(得分:2)
您可以使用hashValue
来确定两个对象 不 是否相等。
除此之外,不应仅根据对象的哈希值对对象进行Equatable
或Comparable
确定。
简而言之,Hashable
派生自Equatable
,因为您无法通过测试hashValue
是否相等来安全地确定两个对象是否相等。
更多详情
哈希值是一个Int值,对于平等比较的所有对象都是相同的,因此如果
a == b
,它跟在a.hashValue == b.hashValue
之后。
但是,反之则不然。如果a.hashValue == b.hashValue
,则 不 会跟随a == b
。
虽然有完美的哈希函数返回unique
值,但哈希函数可以为两个或更多不同的对象返回相同的hashValue
。这称为哈希冲突。
避免尝试这样做
对于Hashable,因为您可以获得表示对象的数字,您可以将对象视为数字。您可以比较对象:它是否小于,大于或等于另一个对象,就像您对数字一样:
没有。您要比较的是(可能碰撞的)对象的哈希值,不对象本身。
Hashable
之外, Equatable
本身的使用非常有限。为安全起见,您应始终自行测试对象。</ p>