RuntimeHelpers.GetHashCode(Object) Metoda

Definice

Slouží jako funkce hash pro určitý objekt a je vhodný pro použití v algoritmech a datových strukturách, které používají kódy hash, jako je například zatřiďovací tabulka.

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

Parametry

o
Object

Objekt, pro který má být načten kód hash.

Návraty

Int32

Kód hash pro objekt identifikovaný o parametrem.

Příklady

Následující příklad ukazuje rozdíl mezi Object.GetHashCode RuntimeHelpers.GetHashCode metodami a. Výstup z příkladu ilustruje následující:

  • Obě sady kódů hash první sady řetězců předané ShowHashCodes metodě jsou odlišné, protože řetězce jsou zcela rozdílné.

  • Object.GetHashCode generuje stejný kód hash pro druhou sadu řetězců předaných ShowHashCodes metodě, protože řetězce jsou stejné. Metoda ale neumožňuje RuntimeHelpers.GetHashCode . První řetězec je definován pomocí řetězcového literálu, a proto je interně. I když je hodnota druhého řetězce stejná, není interně, protože je vrácena voláním String.Format metody.

  • V případě třetího řetězce jsou kódy hash vytvořené Object.GetHashCode pro oba řetězce identické, stejně jako jsou hash kódy vytvořené pomocí RuntimeHelpers.GetHashCode . Důvodem je to, že kompilátor zpracoval hodnotu přiřazenou oběma řetězcům jako jediný řetězcový literál, takže proměnné řetězce odkazují na stejný interně určený řetězec.

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

Poznámky

RuntimeHelpers.GetHashCodeMetoda vždy volá Object.GetHashCode metodu, která není prakticky prakticky, i když typ objektu přepsal Object.GetHashCode metodu. Proto použití se RuntimeHelpers.GetHashCode může lišit od volání GetHashCode přímo na objekt s Object.GetHashCode metodou.

Upozornění

I když RuntimeHelpers.GetHashCode Metoda vrátí identické kódy hash pro identické odkazy na objekty, neměli byste tuto metodu používat k testování identity objektu, protože tento kód hash jednoznačně neidentifikuje odkaz na objekt. Chcete-li otestovat pro identifikaci objektu (tj. Chcete-li otestovat, že dva objekty odkazují na stejný objekt v paměti), zavolejte Object.ReferenceEquals metodu. Ani byste měli použít GetHashCode k otestování, zda dva řetězce reprezentují stejné odkazy na objekty, protože řetězec je interně. Chcete-li otestovat pro interning pro řetězce, zavolejte String.IsInterned metodu.

Object.GetHashCodeMetody a RuntimeHelpers.GetHashCode se liší následujícím způsobem:

  • Object.GetHashCode Vrátí kód hodnoty hash, který je založen na definici rovnosti objektu. Například dva řetězce s identickým obsahem budou vracet stejnou hodnotu pro Object.GetHashCode .

  • RuntimeHelpers.GetHashCode Vrátí hodnotu hash, která označuje identitu objektu. To znamená, že dvě řetězcové proměnné, jejichž obsah je identický a který představuje řetězec, který je interně (viz oddíl pro průnik řetězců ), nebo který představuje jeden řetězec v paměti, vrátí identické kódy hash.

Důležité

Všimněte si, že GetHashCode vždycky vrátí stejné kódy hash pro stejné odkazy na objekty. Opačný stav však není true: stejné hash kódy neoznačují stejné odkazy na objekty. Konkrétní hodnota kódu hash není jedinečná pro konkrétní odkaz na objekt. různé odkazy na objekty mohou generovat identické kódy hash.

Tato metoda je používána kompilátory.

Interning řetězce

Modul CLR (Common Language Runtime) udržuje interní fond řetězců a ukládá do fondu literály. Pokud jsou dva řetězce (například str1 a str2 ) tvořeny identickým řetězcovým literálem, modul CLR nastaví str1 a bude str2 odkazovat na stejné umístění na spravované haldě pro zachování paměti. Volání RuntimeHelpers.GetHashCode na těchto dvou objektech řetězce vytvoří stejný kód hash na rozdíl od druhé odrážkové položky v předchozí části.

Modul CLR přidá do fondu pouze literály. Výsledky operací s řetězci, jako je například zřetězení, nejsou přidány do fondu, pokud kompilátor nerozpozná zřetězení řetězců jako jediný řetězcový literál. Proto pokud str2 byl vytvořen jako výsledek operace zřetězení a str2 je totožný s str1 , použití RuntimeHelpers.GetHashCode na těchto dvou objektech řetězce nebude vytvářet stejný kód hash.

Pokud chcete do fondu explicitně přidat zřetězený řetězec, použijte String.Intern metodu.

Můžete také použít String.IsInterned metodu ke kontrole, zda řetězec obsahuje interně odkaz.

Platí pro

Viz také