Object.GetHashCode 方法

定義

做為預設哈希函式。

public:
 virtual int GetHashCode();
public virtual int GetHashCode();
abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int
Public Overridable Function GetHashCode () As Integer

傳回

目前物件的雜湊碼。

備註

欲了解更多關於此 API 的資訊,請參閱 Object.GetHashCode 的補充 API 備註

給繼承者的注意事項

雜湊函數用於快速產生一個數字(雜湊碼),對應於物件的值。 雜湊函數通常針對每種類型特定,且為了保持唯一性,必須至少使用其中一個實例欄位作為輸入。 雜湊碼不應利用靜態欄位的值來計算。

對於由 Object導出的 GetHashCode 類別,方法只有在導出類別定義等號為參考相等時,才能委派給基底類別 GetHashCode() 實作。 預設的 參考型別實作 GetHashCode() 會回傳一個與方法回傳 GetHashCode(Object) 的雜湊碼等價的雜湊碼。 你可以覆寫 GetHashCode() 不可變的參考類型。 一般而言,對於可變的參考類型,只有當以下情況才應該覆寫 GetHashCode()

  • 你可以從不可變的欄位計算雜湊碼;或

  • 你可以確保在物件包含於依賴其雜湊碼的集合中時,其雜湊碼不會改變。

否則,你可能會認為可變物件已經在雜湊表中遺失了。 如果你選擇覆蓋 GetHashCode() 可變參考型別,文件應該會明確說明,使用者在物件存放於雜湊表時,不應修改物件值。

對於值型別,提供 GetHashCode() 一個使用反射的預設雜湊碼實作。 你應該考慮覆蓋它以提升效能。

欲了解更多資訊及以多種方式計算雜湊碼的範例,請參閱範例章節。

雜湊函數必須具備以下特性:

  • 如果兩個物件比較為相等,則每個物件的方法 GetHashCode() 必須回傳相同的值。 然而,如果兩個物件的比較不等同, GetHashCode() 則兩個物件的方法不必回傳不同的值。

  • GetHashCode()只要物件狀態沒有變動,無法決定該物件 System.Object.Equals 方法的回傳值,物件的方法必須一致回傳相同的雜湊碼。 請注意,這僅適用於應用程式目前執行時,且若再次執行該應用程式,可能會回傳不同的雜湊碼。

  • 為了達到最佳效能,雜湊函數應該對所有輸入產生均勻分布,包括高度聚類的輸入。 其含意是,對物件狀態的微小修改應導致對雜湊碼進行大幅修改,以達到最佳雜湊表效能。

  • 雜湊函數的計算成本應該很低。

  • GetHashCode() 方法不應該拋出例外。

例如,該類別所提供的GetHashCode()方法實作String會回傳相同的雜湊碼,且字串值相同。 因此,若兩個 String 物件代表相同的字串值,則回傳相同的雜湊碼。 此外,該方法使用字串中的所有字元來產生合理隨機分布的輸出,即使輸入被聚集在特定範圍內(例如,許多使用者的字串可能只包含較低的 128 個 ASCII 字元,儘管一個字串可以包含 65,535 個 Unicode 字元中的任意一個)。

在類別上提供良好的雜湊函數,會大幅影響將這些物件加入雜湊表的效能。 在帶有鍵數提供良好雜湊函數實作的雜湊表中,搜尋元素需要常數時間(例如,O(1) 操作)。 在雜湊表中雜湊函數實作不佳,搜尋的效能取決於雜湊表中項目的數量(例如,O(n) 操作,其中 n 是雜湊表中的項目數量)。 惡意使用者可能會輸入資料,增加碰撞次數,進而大幅降低依賴雜湊表的應用程式效能,條件如下:

  • 當雜湊函數產生頻繁碰撞時。

  • 當雜湊表中大量物件產生相等或近似相等的雜湊碼時。

  • 當使用者輸入計算雜湊碼的資料時,

覆蓋 GetHashCode() 的衍生類別也必須 Equals(Object) 覆蓋,以確保兩個被視為相等的物件擁有相同的雜湊碼;否則,該 Hashtable 型別可能無法正常運作。

適用於

另請參閱