[英]hashcode and equals contract vice versa
我知道合同說“如果兩個對象相等,那么它們應該返回相同的哈希碼”。 那是為了讓那些對象可以放在同一個哈希桶中,並改進哈希碼相關的收集函數。 然后又是為什么它說“如果兩個對象具有相同的哈希碼,它們不應該總是相等”。 我的意思是,如果在合同中是真的,我們應該說“如果兩個對象相等,它們可能會返回相同的哈希碼,但這不是強制性的”
我的意思是,如果合同中的內容是正確的,我們應該說“如果兩個對象相等,它們可能會返回相同的哈希碼,但這不是強制性的”
不,不應該 。 這是因為,每當在HashMap
或HashSet
搜索對象時,然后首先根據hashCode
對其進行搜索( 注意:對於ArrayList
或LinkedList
, hashCode()
不用於搜索。而不是hash based
集合),然后,如果兩個對象具有相同的哈希碼,則移至equals
方法以比較對象本身。
現在,假設上面的語句為true,則對於這些對象,第一個測試本身將失敗。 也就是說,如果允許兩個相等的對象具有不同的哈希碼,則在搜索特定的hashCode時,它將不會返回正確的結果,因此測試將不會繼續執行equals method
,甚至會聲明這些對象unequal
盡管您希望它們相等。
現在轉到第二條語句:-
如果兩個對象具有相同的哈希碼,則它們不應該始終相等”
讓我們這樣理解:-由於為每個對象生成的hashCode
的類型為int
,因此您最多可以生成2 ^ 32
唯一的hashcodes
。 因此,想象一下如果您想存儲更多的對象會發生什么。 在那種情況下,必須有two different objects
的碰撞 。 因此,除了將相同的hashCodes
分配給兩個不同的對象之外,您別無選擇。 因此,以上陳述是合理的。
因此,從以上解釋中可以很清楚地看出兩點 :-
以下鏈接中提供了有關此主題的更多詳細信息(沒有比這可以提供更好的解釋了):-
不。 這些文檔是正確的,您會感到困惑。
例如,以下始終是hashCode()
的有效實現:
public int hashCode() {
return 0;
// clearly all equal objects have the same hash code -- 0
// but it's totally okay that unequal objects also have the same hash code
}
HashMap
可以在每個存儲桶中存儲多個條目,選擇哪個存儲桶取決於哈希碼。 HashMap
通過使用hashcode()
來識別存儲桶,然后通過equals()
在該存儲桶中找到匹配的密鑰來找到密鑰的條目。
鑒於以上所述,應該清楚的是,您可以具有幾乎沒有問題的重復哈希碼(如果多個對象具有相同的哈希碼,則它會影響HashMap的性能 ,但一切仍將正常進行)
如果2個相同的哈希碼必須來自同一對象,則哈希將不那么安全。 從技術上講,可以根據哈希來確定密碼是什么。 這將破壞哈希碼的目的(至少在安全意義上)。
對於非安全性哈希,如果您可以讓每個唯一值都進行唯一哈希,則將解決未解決的計算問題。
哈希函數通常是
單向功能
:某些輸入值(對象)可能會產生相同的哈希碼。
基本上是說,如果兩個對象具有相同的哈希碼,則它們應該相等。 但是,並非總是如此,因為沒有(完美的)哈希函數總是將不同的哈希分配給不同的對象。
由於哈希沖突 ,不同的對象可以具有相同的哈希碼。
但是兩個相等的對象應該具有相同的哈希碼 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.