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 чтобы проверить, имеет ли строка интернированную ссылку.

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

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