簡體   English   中英

哈希碼和等於合同反之亦然

[英]hashcode and equals contract vice versa

我知道合同說“如果兩個對象相等,那么它們應該返回相同的哈希碼”。 那是為了讓那些對象可以放在同一個哈希桶中,並改進哈希碼相關的收集函數。 然后又是為什么它說“如果兩個對象具有相同的哈希碼,它們不應該總是相等”。 我的意思是,如果在合同中是真的,我們應該說“如果兩個對象相等,它們可能會返回相同的哈希碼,但這不是強制性的”

我的意思是,如果合同中的內容是正確的,我們應該說“如果兩個對象相等,它們可能會返回相同的哈希碼,但這不是強制性的”

不,不應該 這是因為,每當在HashMapHashSet搜索對象時,然后首先根據hashCode對其進行搜索( 注意:對於ArrayListLinkedListhashCode()不用於搜索。而不是hash based集合),然后,如果兩個對象具有相同的哈希碼,則移至equals方法以比較對象本身。

現在,假設上面的語句為true,則對於這些對象,第一個測試本身將失敗。 也就是說,如果允許兩個相等的對象具有不同的哈希碼,則在搜索特定的hashCode時,它將不會返回正確的結果,因此測試將不會繼續執行equals method ,甚至會聲明這些對象unequal盡管您希望它們相等。

現在轉到第二條語句:-

如果兩個對象具有相同的哈希碼,則它們不應該始終相等”

讓我們這樣理解:-由於為每個對象生成的hashCode的類型為int ,因此您最多可以生成2 ^ 32唯一的hashcodes 因此,想象一下如果您想存儲更多的對象會發生什么。 在那種情況下,必須有two different objects碰撞 因此,除了將相同的hashCodes分配給兩個不同的對象之外,您別無選擇。 因此,以上陳述是合理的。


因此,從以上解釋中可以很清楚地看出兩點 :-

  • 兩個相同的對象必須具有相同的hashCodes。
  • 兩個不同的對象可以具有相同的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM