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.Serves as a hash function for a particular object, and is suitable for use in algorithms and data structures that use hash codes, such as a hash table.

public:
 static int GetHashCode(System::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.An object to retrieve the hash code for.

Návraty

Kód hash pro objekt identifikovaný o parametrem.A hash code for the object identified by the o parameter.

Příklady

Následující příklad ukazuje rozdíl mezi Object.GetHashCode metodami a. RuntimeHelpers.GetHashCodeThe following example demonstrates the difference between the Object.GetHashCode and RuntimeHelpers.GetHashCode methods. Výstup z příkladu ilustruje následující:The output from the example illustrates the following:

  • Obě sady kódů hash první sady řetězců předané ShowHashCodes metodě jsou odlišné, protože řetězce jsou zcela rozdílné.Both sets of hash codes for the first set of strings passed to the ShowHashCodes method are different, because the strings are completely different.

  • Object.GetHashCodegeneruje stejný kód hash pro druhou sadu řetězců předaných ShowHashCodes metodě, protože řetězce jsou stejné.Object.GetHashCode generates the same hash code for the second set of strings passed to the ShowHashCodes method, because the strings are equal. RuntimeHelpers.GetHashCode Metoda ale neumožňuje.However, the RuntimeHelpers.GetHashCode method does not. První řetězec je definován pomocí řetězcového literálu, a proto je interně.The first string is defined by using a string literal and so is interned. I když je hodnota druhého řetězce stejná, není interně, protože je vrácena voláním String.Format metody.Although the value of the second string is the same, it is not interned, because it is returned by a call to the String.Format method.

  • 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.GetHashCodeIn the case of the third string, the hash codes produced by Object.GetHashCode for both strings are identical, as are the hash codes produced by 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.This is because the compiler has treated the value assigned to both strings as a single string literal, and so the string variables refer to the same interned string.

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

Metoda vždy volá metodu, která není prakticky prakticky, i když typ objektu přepsal Object.GetHashCode metodu. Object.GetHashCode RuntimeHelpers.GetHashCodeThe RuntimeHelpers.GetHashCode method always calls the Object.GetHashCode method non-virtually, even if the object's type has overridden the Object.GetHashCode method. Proto použití RuntimeHelpers.GetHashCode se může lišit od volání GetHashCode přímo Object.GetHashCode na objekt s metodou.Therefore, using RuntimeHelpers.GetHashCode might differ from calling GetHashCode directly on the object with the Object.GetHashCode method.

Varová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.Although the RuntimeHelpers.GetHashCode method returns identical hash codes for identical object references, you should not use this method to test for object identity, because this hash code does not uniquely identify an object reference. Chcete-li otestovat pro identifikaci objektu (tj. Chcete-li otestovat, že dva objekty odkazují na stejný objekt v paměti Object.ReferenceEquals ), zavolejte metodu.To test for object identify (that is, to test that two objects reference the same object in memory), call the Object.ReferenceEquals method. 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ě.Nor should you use GetHashCode to test whether two strings represent equal object references, because the string is interned. Chcete-li otestovat pro interning pro řetězce String.IsInterned , zavolejte metodu.To test for string interning, call the String.IsInterned method.

Metody Object.GetHashCode aRuntimeHelpers.GetHashCode se liší následujícím způsobem:The Object.GetHashCode and RuntimeHelpers.GetHashCode methods differ as follows:

  • Object.GetHashCodeVrátí kód hodnoty hash, který je založen na definici rovnosti objektu.Object.GetHashCode returns a hash code that is based on the object's definition of equality. Například dva řetězce s identickým obsahem budou vracet stejnou hodnotu pro Object.GetHashCode.For example, two strings with identical contents will return the same value for Object.GetHashCode.

  • RuntimeHelpers.GetHashCodeVrátí hodnotu hash, která označuje identitu objektu.RuntimeHelpers.GetHashCode returns a hash code that indicates object identity. 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.That is, two string variables whose contents are identical and that represent a string that is interned (see the String Interning section) or that represent a single string in memory return identical hash codes.

Důležité

Všimněte si GetHashCode , že vždycky vrátí stejné kódy hash pro stejné odkazy na objekty.Note that GetHashCode always returns identical hash codes for equal object references. Opačný stav však není true: stejné hash kódy neoznačují stejné odkazy na objekty.However, the reverse is not true: equal hash codes do not indicate equal object references. 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.A particular hash code value is not unique to a particular object reference; different object references can generate identical hash codes.

Tato metoda je používána kompilátory.This method is used by compilers.

Interning řetězceString Interning

Modul CLR (Common Language Runtime) udržuje interní fond řetězců a ukládá do fondu literály.The common language runtime (CLR) maintains an internal pool of strings and stores literals in the pool. Pokud jsou dva řetězce ( str1 například a str2) tvořeny identickým řetězcovým literálem, modul CLR nastaví str1 a str2 bude odkazovat na stejné umístění na spravované haldě pro zachování paměti.If two strings (for example, str1 and str2) are formed from an identical string literal, the CLR will set str1 and str2 to point to the same location on the managed heap to conserve memory. 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.Calling RuntimeHelpers.GetHashCode on these two string objects will produce the same hash code, contrary to the second bulleted item in the previous section.

Modul CLR přidá do fondu pouze literály.The CLR adds only literals to the pool. 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.Results of string operations such as concatenation are not added to the pool, unless the compiler resolves the string concatenation as a single string literal. 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.Therefore, if str2 was created as the result of a concatenation operation, and str2 is identical to str1, using RuntimeHelpers.GetHashCode on these two string objects will not produce the same hash code.

Pokud chcete do fondu explicitně přidat zřetězený řetězec, použijte String.Intern metodu.If you want to add a concatenated string to the pool explicitly, use the String.Intern method.

Můžete také použít String.IsInterned metodu ke kontrole, zda řetězec obsahuje interně odkaz.You can also use the String.IsInterned method to check whether a string has an interned reference.

Platí pro

Viz také