RuntimeHelpers.GetHashCode(Object) Метод

Определение

Служит в качестве хэш-функции для конкретного объекта и подходит для использования в алгоритмах и структурах данных, использующих хэш-коды, например в хэш-таблице.

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

Параметры

o
Object

Объект, для которого нужно извлечь хэш-код.

Возвращаемое значение

Int32

Хэш-код для объекта, идентифицируемого по параметру o.

Примеры

В следующем примере показано различие между методами Object.GetHashCode и RuntimeHelpers.GetHashCode . В выходных данных примера показано следующее:

  • Оба набора хэш-кодов для первого набора строк, переданных методу ShowHashCodes , отличаются, так как строки совершенно разные.

  • Object.GetHashCode создает тот же хэш-код для второго набора строк, переданных методу ShowHashCodes , так как строки равны. Однако RuntimeHelpers.GetHashCode метод не выполняет этого. Первая строка определяется с помощью строкового литерала и поэтому интернируется. Хотя значение второй строки совпадает, оно не интернируется, так как оно возвращается вызовом String.Format метода .

  • В случае с третьей строкой хэш-коды, создаваемые для Object.GetHashCode обеих строк, идентичны, как и хэш-коды, созданные .RuntimeHelpers.GetHashCode Это связано с тем, что компилятор рассматривает значение, присвоенное обеим строкам, как один строковый литерал, и поэтому строковые переменные ссылаются на одну и ту же интернированную строку.

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

Комментарии

Метод RuntimeHelpers.GetHashCode всегда вызывает Object.GetHashCode метод невиртуационно, даже если тип объекта переопределен Object.GetHashCode . Поэтому использование RuntimeHelpers.GetHashCode может отличаться от вызова GetHashCode непосредственно в объекте Object.GetHashCode с помощью метода .

Предупреждение

RuntimeHelpers.GetHashCode Хотя метод возвращает идентичные хэш-коды для идентичных ссылок на объекты, не следует использовать этот метод для проверки идентификатора объекта, так как этот хэш-код не однозначно идентифицирует ссылку на объект. Чтобы проверить идентификацию объекта (т. е Object.ReferenceEquals . проверить, ссылается ли два объекта на один и тот же объект в памяти), вызовите метод . Также не следует использовать для GetHashCode проверки того, представляют ли две строки равные ссылки на объекты, так как строка интернирована. Чтобы проверить интернинг строк, вызовите String.IsInterned метод .

Методы Object.GetHashCode и RuntimeHelpers.GetHashCode отличаются следующим образом:

  • Object.GetHashCode возвращает хэш-код, основанный на определении равенства объекта. Например, две строки с одинаковым содержимым будут возвращать одно и то же значение для Object.GetHashCode.

  • RuntimeHelpers.GetHashCode возвращает хэш-код, указывающий удостоверение объекта. То есть две строковые переменные, содержимое которых идентично и которые представляют интернированную строку (см. раздел Чередовка строк ) или представляют одну строку в памяти, возвращают одинаковые хэш-коды.

Важно!

Обратите внимание, что GetHashCode всегда возвращает одинаковые хэш-коды для ссылок на равные объекты. Однако обратное не верно: равные хэш-коды не указывают на равные ссылки на объекты. Определенное значение хэш-кода не является уникальным для конкретной ссылки на объект; разные ссылки на объекты могут создавать одинаковые хэш-коды.

Этот метод используется компиляторами.

Чередовка строк

Среда CLR поддерживает внутренний пул строк и сохраняет литералы в пуле. Если две строки (например, str1 и str2) формируются из идентичного строкового литерала, среда CLR установит str1 и str2 , чтобы указать на одно и то же расположение в управляемой куче для экономии памяти. При вызове RuntimeHelpers.GetHashCode этих двух строковых объектов будет получен один и тот же хэш-код, в отличие от второго маркированного элемента в предыдущем разделе.

Среда CLR добавляет в пул только литералы. Результаты строковых операций, таких как объединение, не добавляются в пул, если компилятор не разрешает объединение строк в виде одного строкового литерала. Таким образом, если str2 был создан в результате операции объединения и str2 идентичен str1, использование RuntimeHelpers.GetHashCode для этих двух строковых объектов не приведет к созданию одинакового хэш-кода.

Если вы хотите добавить в пул сцепленную строку явным образом, используйте String.Intern метод .

Вы также можете использовать метод , String.IsInterned чтобы проверить, содержит ли строка интернированную ссылку.

Применяется к

См. также раздел