2017-07-03 24 views
2

我讀SetSet如何確保Swift中的等價性?

使用一組數組,而不是當你需要有效地測試成員和你不關心元素的集合,或在訂單時,你需要確保每個元素在集合中只出現一次。

基本上Set確保唯一,它有一些方法和依賴於Hashable

使用含有(_ :)方法來測試一組是否包含特定元素。

使用減法(_ :)方法來創建一個新的集合與不是也在另一組或序列的集合中的元素

但2個不同的對象可以有相同的hashValue,像這篇文章Swift Hashable

不要假定具有相同散列值的類型的兩個實例是相等的。根據我們計算散列值的方式,我們可以得到兩個不同實例共享相同散列值的衝突。 Hashable協議只需要反向 - 兩個相等的實例具有相同的散列值。

那麼,如果兩個對象具有相同的hashValue,並Set不僅節省了1,那麼我們有什麼問題?

+1

該文檔沒有聲明只保存具​​有不同hashValue的項目。 –

+1

「那麼如果2個對象具有相同的散列值,而Set僅保存1,那麼我們有問題?」 編號設置將存儲2個對象。這種情況稱爲散列衝突,Set將處理該情況。 –

回答

5

符合Hashable的對象也必須是EquatableSet使用==來測試是否相等,它不僅僅取決於hashValue

從蘋果公司的文件上Hashable

符合哈希的協議

要在 組或作爲字典的密鑰類型使用自己的自定義類型,哈希的符合添加到 您通過提供一個hashValue屬性來鍵入。 Hashable協議 繼承自Equatable協議,因此您還必須爲您的自定義類型添加等於 運算符(==)的函數。

的文件接着說:

集和字典的性能取決於哈希值分別減少 碰撞對他們相關的元素和主要類型。

因此,hashValue只是第一次測試的唯一性;如果hashValue匹配,則Set將使用計算上更昂貴的==來測試唯一性。