首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Effective C# 原則 10:瞭解 GetHashCode() 的缺陷(一)

     編輯:關於C語言

GetHashCode() 唯一用途

僅用於雜湊基礎集合的鍵:Hashtable、Dictionary、HashSet。其他情況(UI 控制項、資料庫連線、檔案控制代碼)不應作鍵。

何時可忽略

  • 型別永不作雜湊鍵 → 什麼都不用做
  • 參考型別:預設行為正確(雖效能較差)
  • 不可變實值型別:預設行為通常正確

雜湊集合運作原理

  1. 物件產生 int 雜湊碼
  2. 依雜湊碼分配到「桶」
  3. 查找時:計算鍵雜湊碼 → 找桶 → 桶內用 Equals 精確比對

覆寫必須遵守的三大規則

  1. 相等性:a.Equals(b) == true → a.GetHashCode() == b.GetHashCode()
  2. 不可變性:物件生命週期內 GetHashCode() 恆定回傳相同值
  3. 均勻分布:對所有輸入,雜湊碼在 int 範圍均勻分布

Object.GetHashCode() 分析

  • 使用內部物件 ID(建構時指派、永不變)
  • 規則 1:滿足(預設 == 比較 ID)
  • 規則 2:滿足(ID 不變)
  • 規則 3:不滿足(ID 遞增,分布集中在小整數)
  • 結論:正確但效能差

ValueType.GetHashCode() 分析

public struct MyStruct
{
    private string _msg;      // 第一欄位
    private int _id;
    private DateTime _epoch;
}

// 預設雜湊碼 = _msg.GetHashCode()
MyStruct s = new MyStruct();
bool same = s.GetHashCode() == s._msg.GetHashCode(); // 永遠 true

後續部分驗證三大規則於 ValueType 預設實作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved