Object.GetHashCode 方法

定義

做為預設雜湊函式。

public virtual int GetHashCode ();

傳回

目前物件的雜湊碼。

備註

如需此 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 類型可能無法正常運作。

適用於

產品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

另請參閱