RuntimeHelpers.GetHashCode(Object) Metoda

Definicja

Służy jako funkcja skrótu dla określonego obiektu i jest odpowiednia do użycia w algorytmach i strukturach danych, które używają kodów skrótów, takich jak tabela skrótów.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

Obiekt, dla którego ma zostać pobrany kod skrótu.An object to retrieve the hash code for.

Zwraca

Kod skrótu dla obiektu identyfikowanego przez parametr o.A hash code for the object identified by the o parameter.

Przykłady

Poniższy przykład ilustruje różnicę między metodami Object.GetHashCode i RuntimeHelpers.GetHashCode.The following example demonstrates the difference between the Object.GetHashCode and RuntimeHelpers.GetHashCode methods. Dane wyjściowe z przykładu przedstawiają następujące elementy:The output from the example illustrates the following:

  • Oba zestawy skrótów dla pierwszego zestawu ciągów przekazywane do metody ShowHashCodes są różne, ponieważ ciągi są całkowicie różne.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.GetHashCode generuje ten sam kod skrótu dla drugiego zestawu ciągów przekazaną do metody ShowHashCodes, ponieważ ciągi są równe.Object.GetHashCode generates the same hash code for the second set of strings passed to the ShowHashCodes method, because the strings are equal. Jednak Metoda RuntimeHelpers.GetHashCode nie.However, the RuntimeHelpers.GetHashCode method does not. Pierwszy ciąg jest definiowany przy użyciu literału ciągu i dlatego jest InterNIC.The first string is defined by using a string literal and so is interned. Chociaż wartość drugiego ciągu jest taka sama, nie jest InterNIC, ponieważ jest zwracana przez wywołanie metody String.Format.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.

  • W przypadku trzeciego ciągu kody skrótów tworzone przez Object.GetHashCode dla obu ciągów są identyczne, podobnie jak kody skrótów tworzone przez RuntimeHelpers.GetHashCode.In 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. Wynika to z faktu, że kompilator przetworzył wartość przypisaną do obu ciągów jako jeden literał ciągu znaków, dlatego zmienne String odwołują się do tego samego ciągu InterNIC.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

Uwagi

Metoda RuntimeHelpers.GetHashCode zawsze wywołuje metodę Object.GetHashCode niepraktycznie, nawet jeśli typ obiektu przesłonił metodę Object.GetHashCode.The RuntimeHelpers.GetHashCode method always calls the Object.GetHashCode method non-virtually, even if the object's type has overridden the Object.GetHashCode method. W związku z tym użycie RuntimeHelpers.GetHashCode może różnić się od wywołania GetHashCode bezpośrednio do obiektu za pomocą metody Object.GetHashCode.Therefore, using RuntimeHelpers.GetHashCode might differ from calling GetHashCode directly on the object with the Object.GetHashCode method.

Ostrzeżenie

Chociaż metoda RuntimeHelpers.GetHashCode zwraca identyczne kody skrótów dla identycznych odwołań do obiektów, nie należy używać tej metody do testowania tożsamości obiektu, ponieważ ten kod skrótu nie identyfikuje jednoznacznie odwołania do obiektu.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. Aby przetestować dla identyfikacji obiektu (to oznacza, że w celu przetestowania, że dwa obiekty odwołują się do tego samego obiektu w pamięci), wywołaj metodę Object.ReferenceEquals.To test for object identify (that is, to test that two objects reference the same object in memory), call the Object.ReferenceEquals method. Nie należy używać GetHashCode do testowania, czy dwa ciągi reprezentują równe odwołania do obiektów, ponieważ ciąg jest InterNIC.Nor should you use GetHashCode to test whether two strings represent equal object references, because the string is interned. Aby przetestować dla ciągu InterNIC, wywołaj metodę String.IsInterned.To test for string interning, call the String.IsInterned method.

Metody Object.GetHashCode i RuntimeHelpers.GetHashCode różnią się w następujący sposób:The Object.GetHashCode and RuntimeHelpers.GetHashCode methods differ as follows:

  • Object.GetHashCode zwraca kod skrótu, który jest oparty na definicji równości obiektu.Object.GetHashCode returns a hash code that is based on the object's definition of equality. Na przykład dwa ciągi o identycznej zawartości będą zwracać tę samą wartość dla Object.GetHashCode.For example, two strings with identical contents will return the same value for Object.GetHashCode.

  • RuntimeHelpers.GetHashCode zwraca kod skrótu, który wskazuje tożsamość obiektu.RuntimeHelpers.GetHashCode returns a hash code that indicates object identity. Oznacza to, że dwie zmienne ciągów, których zawartość jest taka sama, i reprezentujące ciąg, który jest InterNIC (patrz sekcja InterNIC ) lub reprezentujący pojedynczy ciąg w pamięci zwraca identycznych kodów skrótów.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.

Ważne

Należy zauważyć, że GetHashCode zawsze zwraca identyczny kod skrótu dla równych odwołań do obiektów.Note that GetHashCode always returns identical hash codes for equal object references. Jednak odwrócenie nie jest prawdziwe: równe kody skrótów nie wskazują równych odwołań do obiektów.However, the reverse is not true: equal hash codes do not indicate equal object references. Określona wartość kodu skrótu nie jest unikatowa dla określonego odwołania do obiektu; inne odwołania do obiektów mogą generować identyczne kody skrótów.A particular hash code value is not unique to a particular object reference; different object references can generate identical hash codes.

Ta metoda jest używana przez kompilatory.This method is used by compilers.

Wewnętrzne przygotowanie ciąguString Interning

Środowisko uruchomieniowe języka wspólnego (CLR) utrzymuje wewnętrzną pulę ciągów i przechowuje literały w puli.The common language runtime (CLR) maintains an internal pool of strings and stores literals in the pool. Jeśli dwa ciągi (na przykład str1 i str2) są tworzone z identycznego literału ciągu, środowisko CLR ustawi str1 i str2, aby wskazywały tę samą lokalizację na zarządzanym stosie, aby zaoszczędzić pamięć.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. Wywołanie RuntimeHelpers.GetHashCode w tych dwóch obiektach String spowoduje wygenerowanie tego samego kodu skrótu w przeciwieństwie do drugiego elementu punktowanego w poprzedniej sekcji.Calling RuntimeHelpers.GetHashCode on these two string objects will produce the same hash code, contrary to the second bulleted item in the previous section.

Środowisko CLR dodaje tylko literały do puli.The CLR adds only literals to the pool. Wyniki operacji na ciągach, takich jak łączenie nie są dodawane do puli, chyba że kompilator rozpoznaje ciąg łączenia jako pojedynczy literał ciągu.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. W związku z tym, jeśli str2 został utworzony w wyniku operacji łączenia, a str2 jest taka sama jak str1, użycie RuntimeHelpers.GetHashCode na tych dwóch obiektach String nie spowoduje utworzenia tego samego kodu skrótu.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.

Jeśli chcesz jawnie dodać połączony ciąg do puli, użyj metody String.Intern.If you want to add a concatenated string to the pool explicitly, use the String.Intern method.

Można również użyć metody String.IsInterned, aby sprawdzić, czy ciąg ma odwołanie InterNIC.You can also use the String.IsInterned method to check whether a string has an interned reference.

Dotyczy

Zobacz też