在Swift中使用Hashable和Equatable有什么用?什么时候用哪个?

时间:2016-01-21 05:11:17

标签: swift

我知道Hashable继承自Equatable,但是你能给我一个需要Hashable的例子,而不仅仅是Equatable。谢谢!

2 个答案:

答案 0 :(得分:4)

当您符合Hashable时,您提供的方法会返回self哈希值

当您符合Equatable时,您提供的方法可以返回给定对象和self是否相等。

它们似乎有两个截然不同的目的,为什么Hashable会继承Equatable?因为两个相等对象的哈希值相等!

使用HashableEquatable可以做什么,不能做什么?

Equatable的用途比Hashable更有限。它只能比较两个对象的相等性,就是这样。

对于Hashable,因为你可以得到一个代表对象的数字,你可以将对象视为数字。您可以比较对象:它是否小于,大于或等于另一个对象,就像您对数字一样:

if objA.hashValue > objB.hashValue

这也意味着您可以使用Hashable对对象进行排序。

最后但并非最不重要的是,您可以使用Hashable个对象作为地图的键!这是因为地图的密钥不能复制,那么系统如何检查是否在其中放置了重复的项目?它使用键的哈希值!

答案 1 :(得分:2)

您可以使用hashValue来确定两个对象 是否相等。

除此之外,不应仅根据对象的哈希值对对象进行EquatableComparable确定。

简而言之,Hashable派生自Equatable,因为您无法通过测试hashValue是否相等来安全地确定两个对象是否相等。

更多详情

根据Swift documentation

  

哈希值是一个Int值,对于平等比较的所有对象都是相同的,因此如果a == b,它跟在a.hashValue == b.hashValue之后。

但是,反之则不然。如果a.hashValue == b.hashValue,则 会跟随a == b

虽然有完美的哈希函数返回unique值,但哈希函数可以为两个或更多不同的对象返回相同的hashValue。这称为哈希冲突

避免尝试这样做

Sweeper's answer说:

  

对于Hashable,因为您可以获得表示对象的数字,您可以将对象视为数字。您可以比较对象:它是否小于,大于或等于另一个对象,就像您对数字一样:

没有。您要比较的是(可能碰撞的)对象的哈希值,对象本身。

  • 比较散列值是否小于或大于另一个散列值对于对象是没有意义的。
  • 关于相等性,只有如果哈希函数为对象返回一个完全唯一的值,它才会成立。
除了Hashable之外,

Equatable本身的使用非常有限。为安全起见,您应始终自行测试对象。<​​/ p>