簡體   English   中英

使用自定義Equals()和GetHashCode()的Dictionary的最佳性能

[英]Optimal performance of Dictionary with custom Equals() and GetHashCode()

因此,我需要創建一個帶有鍵的字典,這些鍵是帶有自定義Equals()函數的對象。 我發現我也需要重寫GetHashCode()。 我聽說為了獲得最佳性能,您應該使用不會沖突的哈希碼,但這似乎與直覺相反。 我可能會誤會它,但似乎使用哈希碼的全部目的是將項目分組到存儲桶中,如果哈希碼從不沖突,則每個存儲桶將只有1個項目,這似乎無法達到目的。

那么我是否應該故意使我的哈希碼偶爾發生沖突? 性能很重要。 這將是一本字典,可能會增長到數百萬個項目,我將經常進行查找。

哈希碼的目標是為您提供一個數組索引,每個數組都是一個可以包含零個,一個或多個項目的存儲桶。 然后,查詢的性能取決於存儲桶中元素的數量。 越少越好,因為一旦進入存儲桶,便是O(n)搜索(其中n是存儲桶中的元素數)。 因此,理想的是,哈希碼盡可能地防止沖突,並盡可能地延長最佳O(1)時間。

字典將數據存儲在存儲桶中,但每個哈希碼都沒有一個存儲桶。 桶數取決於容量。 根據哈希碼的模數和存儲桶數將值放入存儲桶。

假設您有一個GetHashCode()方法,可為五個對象生成這些哈希碼:

925
10641
14316
17213
28624

哈希碼應散布。 這樣看起來就散開了吧? 如果我們有7個存儲桶,那么最終我們將計算每個存儲桶的模數,從而得出:

1
1
1
0
1

因此,我們最終得到了水桶:

0 - 1 item
1 - 4 items
2 - 0 items
3 - 0 items
4 - 0 items
5 - 0 items
6 - 0 items

哎呀,現在還沒那么好散開。

這不是組成數據。 這些是實際的哈希碼。

這是有關如何從包含的數據中生成哈希碼的示例(不是用於上面的哈希碼的公式,更好的一種)。

https://stackoverflow.com/a/263416/118703

必須確保以下條件成立:

(GetHashCode(a) != GetHashCode(b)) => !Equals(a, b)

反向含義是相同的:

Equals(a, b) => (GetHashCode(a) == GetHashCode(b))

除此之外,產生盡可能少的碰撞。 沖突定義為:

(GetHashCode(a) == GetHashCode(b)) && !Equals(a, b)

碰撞不會影響正確性,但會影響性能。 例如,總是返回零的GetHashCode是正確的,但是很慢。

暫無
暫無

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

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