RuntimeHelpers.GetHashCode(Object) Methode

Definition

Fungiert als Hashfunktion für ein bestimmtes Objekt und eignet sich für die Verwendung in Hashalgorithmen und Hashdatenstrukturen, die Hashcodes verwenden, z. B. in einer Hashtabelle.

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

Parameter

o
Object

Ein Objekt, für das der Hash abgerufen werden soll.

Gibt zurück

Int32

Ein Hashcode für das Objekt , das vom o-Parameter bezeichnet wird.

Beispiele

Im folgenden Beispiel wird der Unterschied zwischen den Methoden und RuntimeHelpers.GetHashCode den Object.GetHashCode Methoden veranschaulicht. Die Ausgabe aus dem Beispiel veranschaulicht Folgendes:

  • Beide Hashcodes für den ersten Satz von Zeichenfolgen, die an die ShowHashCodes Methode übergeben werden, unterscheiden sich, da die Zeichenfolgen vollständig unterschiedlich sind.

  • Object.GetHashCode generiert denselben Hashcode für den zweiten Satz von Zeichenfolgen, die an die ShowHashCodes Methode übergeben werden, da die Zeichenfolgen gleich sind. Die RuntimeHelpers.GetHashCode Methode ist jedoch nicht. Die erste Zeichenfolge wird mithilfe eines Zeichenfolgenliterals definiert und ist daher interniert. Obwohl der Wert der zweiten Zeichenfolge identisch ist, ist sie nicht interniert, da sie von einem Aufruf der String.Format Methode zurückgegeben wird.

  • Bei der dritten Zeichenfolge sind die für beide Zeichenfolgen erzeugten Object.GetHashCode Hashcodes identisch, wie die hashcodes, die von RuntimeHelpers.GetHashCode. Dies liegt daran, dass der Compiler den Wert behandelt hat, der beiden Zeichenfolgen als einzelne Zeichenfolgenliteral zugewiesen ist, und daher beziehen sich die Zeichenfolgenvariablen auf dieselbe interne Zeichenfolge.

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

Hinweise

Die RuntimeHelpers.GetHashCode Methode ruft die Object.GetHashCode Methode immer nicht praktisch auf, auch wenn der Typ des Objekts die Object.GetHashCode Methode außer Kraft gesetzt hat. Die Verwendung RuntimeHelpers.GetHashCode kann sich daher von dem direkten Aufrufen GetHashCode des Objekts mit der Object.GetHashCode Methode unterscheiden.

Warnung

Obwohl die RuntimeHelpers.GetHashCode Methode identische Hashcodes für identische Objektverweise zurückgibt, sollten Sie diese Methode nicht verwenden, um die Objektidentität zu testen, da dieser Hashcode keinen Objektverweis eindeutig identifiziert. Rufen Sie die Object.ReferenceEquals Methode auf, um zu testen, dass zwei Objekte im Arbeitsspeicher auf dasselbe Objekt verweisen. Sie sollten GetHashCode auch nicht testen, ob zwei Zeichenfolgen gleich Objektverweise darstellen, da die Zeichenfolge interniert ist. Rufen Sie die String.IsInterned Methode auf, um die Zeichenfolgeninternierung zu testen.

Die Object.GetHashCode Methoden und RuntimeHelpers.GetHashCode Methoden unterscheiden sich wie folgt:

  • Object.GetHashCode gibt einen Hashcode zurück, der auf der Definition der Gleichheit des Objekts basiert. Beispielsweise gibt zwei Zeichenfolgen mit identischen Inhalten denselben Wert für Object.GetHashCode.

  • RuntimeHelpers.GetHashCode gibt einen Hashcode zurück, der die Objektidentität angibt. Das heißt, zwei Zeichenfolgenvariablen, deren Inhalt identisch sind und eine Zeichenfolge darstellen, die interniert ist (siehe Abschnitt " String Interning ") oder die eine einzelne Zeichenfolge im Speicher geben identische Hashcodes zurück.

Wichtig

Beachten Sie, dass GetHashCode immer identische Hashcodes für gleiche Objektverweise zurückgegeben werden. Die Umgekehrte ist jedoch nicht wahr: Gleichheitshashcodes geben keine Gleichheitsobjektverweise an. Ein bestimmter Hashcodewert ist für einen bestimmten Objektverweis nicht eindeutig; unterschiedliche Objektverweise können identische Hashcodes generieren.

Diese Methode wird von Compilern verwendet.

Zeichenfolgen-Internierung

Die Common Language Runtime (CLR) verwaltet einen internen Pool von Zeichenfolgen und speichert Literale im Pool. Wenn zwei Zeichenfolgen (z. Bstr1. und str2) aus einem identischen Zeichenfolgenliteral gebildet werden, wird der CLR festgelegt und str2 auf denselben Speicherort auf dem verwalteten Heap zeigenstr1, um Arbeitsspeicher zu sparen. Das Aufrufen RuntimeHelpers.GetHashCode dieser beiden Zeichenfolgenobjekte erzeugt denselben Hashcode, im Gegensatz zum zweiten Aufzählungszeichen im vorherigen Abschnitt.

Der CLR fügt dem Pool nur Literale hinzu. Ergebnisse von Zeichenfolgenvorgängen wie Verkettung werden dem Pool nicht hinzugefügt, es sei denn, der Compiler löst die Zeichenfolgenkoncatenation als einzelnes Zeichenfolgenliteral auf. str2 Wenn daher als Ergebnis eines Verkettungsvorgangs erstellt wurde und str2 identisch mit str1der Verwendung RuntimeHelpers.GetHashCode dieser beiden Zeichenfolgenobjekte ist, wird derselbe Hashcode nicht erzeugt.

Wenn Sie dem Pool explizit eine verkettete Zeichenfolge hinzufügen möchten, verwenden Sie die String.Intern Methode.

Sie können auch die String.IsInterned Methode verwenden, um zu überprüfen, ob eine Zeichenfolge über einen internen Verweis verfügt.

Gilt für:

Siehe auch