RuntimeHelpers.GetHashCode(Object) Metoda

Definice

Slouží jako hashová funkce pro konkrétní objekt a je vhodná pro použití v algoritmech a datových strukturách, které používají kódy hash, jako je například tabulka hash.

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 načtení kódu hash.

Návraty

Int32

Kód hash objektu identifikovaného parametrem o .

Příklady

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

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

  • Object.GetHashCode vygeneruje stejný hash kód pro druhou sadu řetězců předaných metodě ShowHashCodes , protože řetězce jsou stejné. RuntimeHelpers.GetHashCode Metoda však není. První řetězec je definován pomocí řetězcového literálu a je tak internován. I když je hodnota druhého řetězce stejná, není internována, 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 stejné, jako jsou kódy hash vytvořené RuntimeHelpers.GetHashCode. Důvodem je to, že kompilátor zacházel s hodnotou přiřazenou oběma řetězci jako jeden řetězcový literál, a proto proměnné řetězce odkazují na stejný interovaný ř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.GetHashCode Metoda vždy volá metodu Object.GetHashCode ne-virtualně, i když typ objektu přepíše metoduObject.GetHashCode. Proto se použití RuntimeHelpers.GetHashCode může lišit od volání GetHashCode přímo na objekt pomocí Object.GetHashCode metody.

Upozornění

RuntimeHelpers.GetHashCode I když metoda vrací identické hashové kódy pro identické odkazy na objekty, neměli byste tuto metodu použít k testování identity objektu, protože tento kód hash jednoznačně neidentifikuje odkaz na objekt. Chcete-li otestovat identifikaci objektu (to znamená otestovat, že dva objekty odkazují na stejný objekt v paměti), zavolejte metodu Object.ReferenceEquals . Ani byste neměli použít GetHashCode k otestování, zda dva řetězce představují stejné odkazy na objekty, protože řetězec je internovaný. Pokud chcete otestovat pro prokládání řetězců, zavolejte metodu String.IsInterned .

Tyto Object.GetHashCode metody se RuntimeHelpers.GetHashCode liší takto:

  • Object.GetHashCode vrátí kód hash, který je založen na definici rovnosti objektu. Například dva řetězce se stejným obsahem vrátí stejnou hodnotu pro Object.GetHashCode.

  • RuntimeHelpers.GetHashCode vrátí kód hash, který označuje identitu objektu. To znamená, že dvě řetězcové proměnné, jejichž obsah je identický a představují řetězec, který je internovaný (viz oddíl Prokládání řetězců ) nebo které představují jeden řetězec v paměti vrací stejné hashové kódy.

Důležité

Všimněte si, že GetHashCode vždy vrací identické hashové kódy pro odkazy na stejné objekty. Obrácená hodnota však není pravdivá: stejné kódy hash neudávají stejné odkazy na objekty. Konkrétní hodnota kódu hash není jedinečná pro konkrétní odkaz na objekt; odkazy na různé objekty můžou generovat identické hashové kódy.

Tato metoda se používá kompilátory.

Interning řetězce

Modul CLR (Common Language Runtime) udržuje interní fond řetězců a ukládá literály do fondu. Pokud jsou dva řetězce (například str1 a str2) vytvořeny z identického řetězcového literálu, clR nastaví str1 a str2 odkazuje na stejné umístění na spravované haldě, aby ušetřil paměť. Volání RuntimeHelpers.GetHashCode těchto dvou řetězcových objektů vytvoří stejný kód hash, na rozdíl od druhé položky s odrážkami v předchozí části.

CLR přidá do fondu pouze literály. Výsledky řetězcových operací, jako je zřetězení, se do fondu nepřidají, pokud kompilátor nepřeloží zřetězení řetězců jako jeden řetězcový literál. Proto pokud str2 byl vytvořen jako výsledek operace zřetězení a str2 je stejný jako str1, použití RuntimeHelpers.GetHashCode na těchto dvou řetězcových objektech nevygeneruje stejný hash kód.

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

Pomocí metody můžete také String.IsInterned zkontrolovat, jestli má řetězec interned odkaz.

Platí pro

Viz také