簡體   English   中英

為確保GetHashCode()方法返回對象的唯一值,應遵循哪些規則?

[英]What are the rules I should follow to ensure GetHashCode() method returns unique value for an object?

為確保GetHashCode()方法返回對象的唯一值,應遵循哪些規則?

例如:

  • 我應該包括一些私有成員進行計算嗎?
  • 我應該乘而不是總和嗎?
  • 我可以確定我正在為特定對象圖生成唯一哈希碼嗎? 等等

你甚至不應該瞄准 GetHashCode()返回的每個對象的唯一值。 這不是 GetHashCode()

埃里克·利珀特(Eric Lippert)撰寫了一篇很棒的有關哈希碼的文章 ,您應該仔細閱讀。 基本上,您希望最終得到的東西將始終為兩個相等的對象返回相同的值(並且您需要計算出相等的含義),並且可能為兩個非相等的對象返回不同的值。

我個人傾向於使用這樣的實現:

public override int GetHashCode()
{
    int hash = 17;
    hash = hash * 31 + field1.GetHashCode();
    hash = hash * 31 + field2.GetHashCode();
    hash = hash * 31 + field3.GetHashCode();
    ...
    return hash;
}

注意事項:

  • 如果您有易變的物品,請當心! 在將對象用作哈希映射中的鍵之后,您不應該對其進行突變。
  • 如果您的字段可以為null,則需要在計算哈希值時檢查該字段。 例如:

     hash = hash * 31 + (field2 == null ? 0 : field2.GetHashCode()); 

您不一定需要簡單的哈希碼,因為您還需要覆蓋Equals進行比較。 通常,我要做的是將我知道的值在對象之間不同,將它們連接成字符串並返回該哈希值。

我認為您的答案在這里:請參閱Jon Skeet答案,這是一種相當可靠的計算方法。 時間證明:)

重寫System.Object.GetHashCode的最佳算法是什么?

暫無
暫無

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

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