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

C# Hashtable 內部運作機制深度解析(一)

     編輯:關於C語言

散列表的核心原理

Hashtable(散列表)透過演算法根據鍵決定值的儲存位置。這個演算法分兩部分:Hashtable 內部邏輯,以及鍵類別必須提供的 GetHashCode() 方法。內建型別(如 string)已實作良好的雜湊演算法,但自訂鍵類別需自行覆寫。

GetHashCode() 的角色

  • 繼承自 System.Object
  • 回傳 int 雜湊碼,供 Hashtable 計算儲存索引
  • Hashtable 取得雜湊碼後,經過複雜運算(涉及質數、位移等)得到最終桶位索引

雜湊衝突與 Equals() 的必要性

不同鍵可能產生相同雜湊碼(衝突),或落入同一桶位。此時 Hashtable 會呼叫 Equals() 比較實際鍵值。因此必須同時覆寫 GetHashCode() 與 Equals(),且兩者邏輯必須一致:相等物件雜湊碼必須相同。

實作範例:EmployeeID 鍵類別

public class EmployeeID
{
    public string Id { get; private set; }

    public EmployeeID(string id) { Id = id; }

    public override int GetHashCode()
    {
        return Id?.GetHashCode() ?? 0; // 防禦性程式設計
    }

    public override bool Equals(object obj)
    {
        return obj is EmployeeID other && Id == other.Id;
    }
}

EmployeeData 值類別

public class EmployeeData
{
    public string Name { get; set; }
    public string Age { get; set; }
    public string Gender { get; set; }

    public EmployeeData(string name, string age, string gender)
    {
        Name = name; Age = age; Gender = gender;
    }
}

使用情境

公司建立員工字典,以 EmployeeID 為鍵、EmployeeData 為值。透過員工編號快速查詢詳細資料。完整測試碼請參閱第(二)部分。

最佳實務建議

  1. 優先使用 Dictionary<TKey, TValue>,避免裝箱/拆箱與型別轉換
  2. 自訂鍵類別務必實作 IEquatable<T> 介面
  3. 雜湊碼計算應盡量分散,減少衝突機率
  4. 不可變型別最適合作為鍵,避免雜湊碼在生命週期中改變
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved