RuntimeHelpers.GetHashCode(Object) Metódus

Definíció

Egy adott objektum kivonatfüggvényeként szolgál, és használható kivonatkódokat használó algoritmusokban és adatstruktúrákban, például kivonattáblákban.

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

Paraméterek

o
Object

Egy objektum, amely lekéri a kivonat kódját.

Válaszok

A paraméter által azonosított objektum kivonatkódja o .

Példák

Az alábbi példa bemutatja a különbséget a Object.GetHashCode és a RuntimeHelpers.GetHashCode módszerek között. A példa kimenete a következőket szemlélteti:

  • A ShowHashCodes metódusnak átadott első karakterláncok mindkét hash kód készlete eltérő, mert a karakterláncok teljesen különbözőek.

  • Object.GetHashCode Ugyanazt a kivonatkódot hozza létre a metódusnak ShowHashCodes átadott második sztringkészlethez, mivel a sztringek egyenlők. Azonban a RuntimeHelpers.GetHashCode módszer nem. Az első karakterlánc karakterlánc-literál használatával van definiálva, és így tárolásra kerül. Bár a második sztring értéke megegyezik, nem internálódik, mert a metódus hívása String.Format adja vissza.

  • A harmadik sztring esetében a két sztring által Object.GetHashCode előállított kivonatkódok azonosak, ahogyan a RuntimeHelpers.GetHashCode. Ennek az az oka, hogy a fordító egyetlen sztringkonstansként kezelte a két sztringhez rendelt értéket, így a sztringváltozók ugyanarra az internált sztringre hivatkoznak.

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

Megjegyzések

A RuntimeHelpers.GetHashCode metódus mindig nem virtuálisan hívja meg a Object.GetHashCode metódust, még akkor is, ha az objektum típusa felülírta a metódust Object.GetHashCode . Ezért RuntimeHelpers.GetHashCode használata eltérhet attól, hogy a GetHashCode metódussal közvetlenül az objektumon hívja meg Object.GetHashCode.

Warning

Bár a RuntimeHelpers.GetHashCode metódus azonos objektumhivatkozások azonos kivonatkódjait adja vissza, ezt a módszert nem érdemes az objektumdentitás tesztelésére használni, mert ez a kivonatkód nem azonosít egyedileg objektumhivatkozásokat. Az objektumdentitás teszteléséhez (vagyis annak ellenőrzéséhez, hogy két objektum ugyanarra az objektumra hivatkozik-e a memóriában), hívja meg a metódust Object.ReferenceEquals . Azt sem érdemes tesztelni, GetHashCode hogy két sztring egyenlő objektumhivatkozásokat jelöl-e, mert a sztring internálva van. A sztring-értékek internálásának teszteléséhez használja a(z) String.IsInterned metódust.

A Object.GetHashCode és a RuntimeHelpers.GetHashCode módszer a következőkben különbözik:

  • Object.GetHashCode egy kivonatkódot ad vissza, amely az objektum egyenlőségi definícióján alapul. Két azonos tartalmú sztring például ugyanazt az értéket Object.GetHashCodeadja vissza.
  • RuntimeHelpers.GetHashCode egy objektumdentitást jelző kivonatkódot ad vissza. Ez azt jelenti, hogy két sztringváltozó, amelyek tartalma megegyezik, és egy internált sztringet jelöl (lásd a Karakterláncközi szakaszt), vagy amelyek egyetlen sztringet jelölnek a memóriában, azonos kivonatkódokat adnak vissza.

Important

Vegye figyelembe, hogy GetHashCode az azonos objektumhivatkozások esetében mindig azonos kivonatkódokat ad vissza. A fordított érték azonban nem igaz: az egyenlő kivonatkódok nem jelölnek egyenlő objektumhivatkozásokat. Egy adott kivonatkód értéke nem egyedi egy adott objektumhivatkozásban; a különböző objektumhivatkozások azonos kivonatkódokat hozhatnak létre.

Ezt a módszert a fordítók használják.

Sztringek közötti internálás

A közös nyelvi futtatókörnyezet (CLR) egy belső sztringhalmazt tart fenn, és a készletben tárolja a literálokat. Ha két karakterlánc (például str1 és str2) azonos sztringkonstansból jön létre, a CLR str1-t és str2-t ugyanarra a helyre irányítja a kezelt halmon, hogy memóriát takarítson meg. A RuntimeHelpers.GetHashCode hívása erre a két sztring objektumra ugyanazt a hash kódot fogja eredményezni, ellentétben az előző szakasz második listajeles elemével.

A CLR csak literálokat ad hozzá a készlethez. A sztringműveletek, például az összefűzés eredményei nem lesznek hozzáadva a készlethez, kivéve, ha a fordító egyetlen sztringkonstansként oldja fel a sztringösszefűzést. Ezért ha str2 egy összefűzési művelet eredményeként jött létre, és str2 megegyezik str1-vel, az a két sztringobjektum alkalmazásával RuntimeHelpers.GetHashCode, nem fogja ugyanazt a kivonatkódot létrehozni.

Ha egy összefűzött karakterláncot szeretne kifejezetten hozzáadni a készlethez, használja a String.Intern metódust.

A String.IsInterned metódust használva azt is ellenőrizheti, hogy egy karakterlánc rendelkezik-e internált hivatkozással.

A következőre érvényes:

Lásd még