[英]string.GetHashCode() uniqueness and collisions
給定兩個不同的字符串, s.GetHashCode() != s1.GetHashCode()
總是這樣嗎?
是不是整數的數量小於不同字符串的數量?
沒有。就像一個簡單的思想實驗:有多少個字符串(提示:超過2 32個 ,因此可以有多少個唯一的哈希碼(提示:2 32。 看問題? )
哈希碼只需要相等時Equals
返回這兩個對象是相等的。 此外,每當兩個哈希碼不相等時,則對象本身不能相等。 沒有進一步的要求,但它們應該分布良好,以便哈希表可以很好地執行。 所以基本上它是:
請注意省略相應的⇐變體。 它不是等價的,僅僅是兩個含義。
引用文檔 :
哈希函數必須具有以下屬性:
如果兩個對象比較相等,則每個對象的GetHashCode方法必須返回相同的值。 但是,如果兩個對象的比較不相等,則兩個對象的GetHashCode方法不必返回不同的值。
只要沒有對對象狀態的修改來確定對象的Equals方法的返回值,對象的GetHashCode方法必須始終返回相同的哈希代碼。 請注意,這僅適用於當前應用程序的執行,並且如果再次運行應用程序,則可以返回不同的哈希代碼。
為獲得最佳性能,哈希函數必須為所有輸入生成隨機分布。
要添加到@ 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.