共用方式為


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() 不應該擲回例外狀況。

例如,類別所提供的 String 方法實作GetHashCode()會針對相同的字串值傳回相同的哈希碼。 因此,如果兩 String 個物件代表相同的字串值,則會傳回相同的哈希碼。 此外,方法會使用字串中的所有字元來產生合理的隨機分散式輸出,即使輸入是叢集在特定範圍 (,許多使用者可能只有較低的 128 ASCII 字元的字串,即使字元串可以包含任何 65,535 Unicode 字元) 。

在類別上提供良好的哈希函式,可能會大幅影響將這些物件新增至哈希表的效能。 在提供哈希函式良好實作的哈希表中,搜尋元素需要固定時間 (例如 O (1) 作業) 。 在哈希函式實作不佳的哈希表中,搜尋的效能取決於哈希表中的項目數 (,例如 O (n) 作業,其中 n 是哈希表) 中的項目數。 惡意使用者可以輸入可增加衝突數目的數據,這可能會在下列情況下大幅降低相依於哈希表的應用程式效能:

  • 當哈希函式產生頻繁衝突時。

  • 當哈希表中的物件比例很大時,會產生等於或近似彼此相等的哈希碼。

  • 當使用者輸入計算哈希碼的數據時。

覆寫的衍生類別也必須覆 GetHashCode()Equals(Object) ,以確保兩個視為相等的物件具有相同的哈希碼,否則 Hashtable 類型可能無法正常運作。

適用於

另請參閱