簡體   English   中英

小班的好哈希? (覆蓋GetHashCode)

[英]Good hash for small class? (override GetHashCode)

我使用一些包含1-2個int的標識類/結構,也可以是日期時間或小字符串。 我將它們用作字典中的鍵。

對於像這樣的東西,GetHashCode的優秀覆蓋是什么? 一些非常簡單的東西,但仍然有點高性能。

謝謝

看一下Essential C#

它包含有關如何正確覆蓋GetHashCode()的詳細說明。

從書中摘錄

哈希碼的目的是通過生成對應於對象值的數字來有效地平衡哈希表

  • 必需:等於對象必須具有相等的哈希碼(如果a.Equals(b) ,則a.GetHashCode() == b.GetHashCode()
  • 必需: GetHashCode()在特定對象的生命周期內的返回應該是常量(相同的值),即使對象的數據發生了變化。 在許多情況下,您應該緩存方法返回以強制執行此操作。
  • 必需: GetHashCode()不應拋出任何異常; GetHashCode()必須始終成功返回值。
  • 性能:哈希代碼應盡可能唯一。 但是,由於哈希代碼只返回一個int ,因此對於具有可能比int可以容納的值更多的值的對象,哈希代碼必須重疊 - 幾乎所有類型。 (一個明顯的例子很long ,因為有更多可能的long值而不是int可以唯一識別。)
  • 性能:可能的哈希碼值應該在int的范圍內均勻分布。 例如,創建一個不考慮基於拉丁語的字符串分布主要以最初的128個ASCII字符為中心這一事實的哈希會導致字符串值的分布非常不均勻,並且不會是強大的GetHashCode()算法。
  • 性能: GetHashCode()應針對性能進行優化。 如果哈希碼不同,則GetHashCode()通常在Equals()實現中用於短路完全等於比較。 因此,當類型在字典集合中用作鍵類型時,經常會調用它。
  • 性能:兩個對象之間的微小差異應導致哈希碼值之間的巨大差異 - 理想情況下,對象中的1位差異導致哈希碼的大約16位平均變化。 這有助於確保哈希表保持平衡,無論它如何“分組”哈希值。
  • 安全性:攻擊者很難制作具有特定哈希碼的對象。 攻擊是使用大量數據填充散列表,這些數據都散列為相同的值。 然后,哈希表實現變為O(n)而不是O(1),從而導致可能的拒絕服務攻擊。

正如這里已經提到的,你還要考慮一些關於重寫Equals()觀點,並且有一些代碼示例展示了如何實現這兩個函數。

因此,這些信息應該給出一個起點,但我建議購買這本書並閱讀完整的第9章(至少是前12個方面),以獲得關於如何正確實現這兩個關鍵功能的所有要點。

暫無
暫無

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

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