RuntimeHelpers.GetHashCode(Object) 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
做為特定物件的雜湊函式,適合在使用雜湊碼之雜湊演算法及資料結構中使用。
public:
static int GetHashCode(System::Object ^ o);
public static int GetHashCode (object o);
public static int GetHashCode (object? o);
static member GetHashCode : obj -> int
Public Shared Function GetHashCode (o As Object) As Integer
參數
- o
- Object
要為其擷取雜湊程式碼的物件。
傳回
由 o
參數所識別之物件的雜湊碼。
範例
下列範例示範 和 RuntimeHelpers.GetHashCode 方法之間的差異 Object.GetHashCode 。 範例的輸出說明下列各項:
傳遞至
ShowHashCodes
方法之第一組字串的兩組雜湊碼都不同,因為字串完全不同。Object.GetHashCode 為傳遞至
ShowHashCodes
方法的第二組字串產生相同的雜湊碼,因為字串相等。 不過, RuntimeHelpers.GetHashCode 方法不會。 第一個字串是使用字串常值來定義,因此是內嵌的。 雖然第二個字串的值相同,但不會將它內建,因為它是由 方法的呼叫 String.Format 所傳回。在第三個字串的情況下,針對這兩個字串所產生的 Object.GetHashCode 雜湊碼完全相同,如同 所產生的雜湊碼。 RuntimeHelpers.GetHashCode 這是因為編譯器已將指派給這兩個字串的值視為單一字串常值,因此字串變數會參考相同的三元字串。
using System;
using System.Runtime.CompilerServices;
public class Example
{
public static void Main()
{
Console.WriteLine("{0,-18} {1,6} {2,18:N0} {3,6} {4,18:N0}\n",
"", "Var 1", "Hash Code", "Var 2", "Hash Code");
// Get hash codes of two different strings.
String sc1 = "String #1";
String sc2 = "String #2";
ShowHashCodes("sc1", sc1, "sc2", sc2);
// Get hash codes of two identical non-interned strings.
String s1 = "This string";
String s2 = String.Format("{0} {1}", "This", "string");
ShowHashCodes("s1", s1, "s2", s2);
// Get hash codes of two (evidently concatenated) strings.
String si1 = "This is a string!";
String si2 = "This " + "is " + "a " + "string!";
ShowHashCodes("si1", si1, "si2", si2);
}
private static void ShowHashCodes(String var1, Object value1,
String var2, Object value2)
{
Console.WriteLine("{0,-18} {1,6} {2,18:X8} {3,6} {4,18:X8}",
"Obj.GetHashCode", var1, value1.GetHashCode(),
var2, value2.GetHashCode());
Console.WriteLine("{0,-18} {1,6} {2,18:X8} {3,6} {4,18:X8}\n",
"RTH.GetHashCode", var1, RuntimeHelpers.GetHashCode(value1),
var2, RuntimeHelpers.GetHashCode(value2));
}
}
// The example displays output similar to the following:
// Var 1 Hash Code Var 2 Hash Code
//
// Obj.GetHashCode sc1 94EABD27 sc2 94EABD24
// RTH.GetHashCode sc1 02BF8098 sc2 00BB8560
//
// Obj.GetHashCode s1 29C5A397 s2 29C5A397
// RTH.GetHashCode s1 0297B065 s2 03553390
//
// Obj.GetHashCode si1 941BCEA5 si2 941BCEA5
// RTH.GetHashCode si1 01FED012 si2 01FED012
Imports System.Runtime.CompilerServices
Module Example
Public Sub Main()
Console.WriteLine("{0,-18} {1,6} {2,18:N0} {3,6} {4,18:N0}",
"", "Var 1", "Hash Code", "Var 2", "Hash Code")
Console.WriteLine()
' Get hash codes of two different strings.
Dim sc1 As String = "String #1"
Dim sc2 As String = "String #2"
ShowHashCodes("sc1", sc1, "sc2", sc2)
' Get hash codes of two identical non-interned strings.
Dim s1 As String = "This string"
Dim s2 As String = String.Format("{0} {1}", "This", "string")
ShowHashCodes("s1", s1, "s2", s2)
' Get hash codes of two (evidently concatenated) strings.
Dim si1 As String = "This is a string!"
Dim si2 As String = "This " + "is " + "a " + "string!"
ShowHashCodes("si1", si1, "si2", si2)
End Sub
Private Sub ShowHashCodes(var1 As String, value1 As Object,
var2 As String, value2 As Object)
Console.WriteLine("{0,-18} {1,6} {2,18:X8} {3,6} {4,18:X8}",
"Obj.GetHashCode", var1, value1.GetHashCode,
var2, value2.GetHashCode)
Console.WriteLine("{0,-18} {1,6} {2,18:X8} {3,6} {4,18:X8}",
"RTH.GetHashCode", var1, RuntimeHelpers.GetHashCode(value1),
var2, RuntimeHelpers.GetHashCode(value2))
Console.WriteLine()
End Sub
End Module
' The example displays output similar to the following:
' Var 1 Hash Code Var 2 Hash Code
'
' Obj.GetHashCode sc1 94EABD27 sc2 94EABD24
' RTH.GetHashCode sc1 02BF8098 sc2 00BB8560
'
' Obj.GetHashCode s1 29C5A397 s2 29C5A397
' RTH.GetHashCode s1 0297B065 s2 03553390
'
' Obj.GetHashCode si1 941BCEA5 si2 941BCEA5
' RTH.GetHashCode si1 01FED012 si2 01FED012
備註
方法 RuntimeHelpers.GetHashCode 一律會以非虛擬方式呼叫 Object.GetHashCode 方法,即使物件的型別已經覆寫方法也 Object.GetHashCode 一樣。 因此,使用 RuntimeHelpers.GetHashCode 可能會與使用 Object.GetHashCode 方法直接在 物件上呼叫 GetHashCode
不同。
警告
RuntimeHelpers.GetHashCode雖然方法會針對相同的物件參考傳回相同的雜湊碼,但您不應該使用此方法來測試物件識別,因為這個雜湊碼不會唯一識別物件參考。 若要測試物件識別 (,也就是若要測試兩個物件是否參考記憶體中的相同物件) ,請呼叫 Object.ReferenceEquals 方法。 也不應該使用 GetHashCode 來測試兩個字串是否代表相等的物件參考,因為字串是三元。 若要測試字串插播,請呼叫 String.IsInterned 方法。
Object.GetHashCode和 RuntimeHelpers.GetHashCode 方法不同,如下所示:
Object.GetHashCode 會根據物件的相等定義,傳回雜湊碼。 例如,具有相同內容的兩個字串會針對 Object.GetHashCode 傳回相同的值。
RuntimeHelpers.GetHashCode 會傳回表示物件識別的雜湊碼。 也就是說,兩個字串變數的內容相同,而且代表字串, (請參閱 字串間 區段) 或表示記憶體中的單一字串傳回相同的雜湊碼。
重要
請注意, GetHashCode 一律會傳回相同物件參考的相同雜湊碼。 不過,相反的不是 true:等號雜湊碼不會表示相等的物件參考。 特定雜湊碼值對特定物件參考而言不是唯一的;不同的物件參考可以產生相同的雜湊碼。
編譯器會使用這個方法。
字串插播
Common Language Runtime (CLR) 會維護字串的內部集區,並將常值儲存在集區中。 例如,如果兩個字串 (, str1
而且 str2
) 是由相同的字串常值組成,則 CLR 會設定 str1
並 str2
指向 Managed 堆積上的相同位置,以節省記憶體。 呼叫 RuntimeHelpers.GetHashCode 這兩個字串物件會產生相同的雜湊碼,與上一節中的第二個專案符號專案相反。
CLR 只會將常值新增至集區。 除非編譯器將字串串連解析為單一字串常值,否則不會將串連之類的字串作業結果新增至集區。 因此,如果 str2
建立為串連作業的結果,而且 與 str2
相同 str1
,則在這兩個字串物件上使用 時 RuntimeHelpers.GetHashCode ,將不會產生相同的雜湊碼。
如果您想要明確地將串連字號串新增至集區,請使用 String.Intern 方法。
您也可以使用 String.IsInterned 方法來檢查字串是否有內建參考。