簡體   English   中英

string.GetHashCode()唯一性和沖突

[英]string.GetHashCode() uniqueness and collisions

給定兩個不同的字符串, s.GetHashCode() != s1.GetHashCode()總是這樣嗎?

是不是整數的數量小於不同字符串的數量?

沒有。就像一個簡單的思想實驗:有多少個字符串(提示:超過2 32個 ,因此可以有多少個唯一的哈希碼(提示:2 32。 看問題?

哈希碼只需要相等Equals返回這兩個對象是相等的。 此外,每當兩個哈希碼相等時,則對象本身不能相等。 沒有進一步的要求,但它們應該分布良好,以便哈希表可以很好地執行。 所以基本上它是:

在此輸入圖像描述

請注意省略相應的⇐變體。 它不是等價的,僅僅是兩個含義。

引用文檔

哈希函數必須具有以下屬性:

  1. 如果兩個對象比較相等,則每個對象的GetHashCode方法必須返回相同的值。 但是,如果兩個對象的比較不相等,則兩個對象的GetHashCode方法不必返回不同的值。

  2. 只要沒有對對象狀態的修改來確定對象的Equals方法的返回值,對象的GetHashCode方法必須始終返回相同的哈希代碼。 請注意,這僅適用於當前應用程序的執行,並且如果再次運行應用程序,則可以返回不同的哈希代碼。

  3. 為獲得最佳性能,哈希函數必須為所有輸入生成隨機分布。

要添加到@ Joey的語句,您主要不能使哈希碼始終不相等。

有2 ^ 32個可能的哈希碼但是無限的輸入字符串。

保證散列沖突具有足夠的(2 ^ 32 + 1)輸入值。

實際上,由於生日問題 ,哈希沖突比人們想象的要普遍得多。 當我做數學而回為使用64個的散列碼系統(其中有超過32位的散列碼的方式更可能哈希值,不只是加倍作為一個可能天真地認為),1億的輸入值是非常可能會有至少1個哈希沖突。 我認為概率約為1%。

據我所知, Object.GetHashCode()不提供對象的哈希函數(所以我認為Joey在這種情況下的考慮不正確),它只返回一個唯一的索引,當創建對象時由CLR分配給對象。當對象被垃圾收集時釋放。

因此,您不能在給定時刻重復使用哈希碼(在相同的AppDomain中),但是您可以在一段時間內重復使用(在應用程序執行期間可能會多次分配相同的索引)。

這里還討論了這個問題: Object.GetHashCode()的默認實現

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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