String.GetHashCode Метод

Определение

Перегрузки

GetHashCode(ReadOnlySpan<Char>, StringComparison)

Возвращает хэш-код для предоставленного диапазона символов, доступного только для чтения, используя указанные правила.

GetHashCode(StringComparison)

Возвращает хэш-код для этой строки, используя указанные правила.

GetHashCode(ReadOnlySpan<Char>)

Возвращает хэш-код для предоставленного диапазона символов, доступного только для чтения.

GetHashCode()

Возвращает хэш-код для этой строки.

GetHashCode(ReadOnlySpan<Char>, StringComparison)

Исходный код:
String.Comparison.cs
Исходный код:
String.Comparison.cs
Исходный код:
String.Comparison.cs

Возвращает хэш-код для предоставленного диапазона символов, доступного только для чтения, используя указанные правила.

public static int GetHashCode (ReadOnlySpan<char> value, StringComparison comparisonType);

Параметры

value
ReadOnlySpan<Char>

Диапазон символов только для чтения.

comparisonType
StringComparison

Одно из значений перечисления, определяющее используемые при сравнении правила.

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

Хэш-код в виде 32-разрядного целого числа со знаком.

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

.NET 9 и другие версии
Продукт Версии
.NET Core 3.0, Core 3.1, 5, 6, 7, 8, 9

GetHashCode(StringComparison)

Исходный код:
String.Comparison.cs
Исходный код:
String.Comparison.cs
Исходный код:
String.Comparison.cs

Возвращает хэш-код для этой строки, используя указанные правила.

public int GetHashCode (StringComparison comparisonType);

Параметры

comparisonType
StringComparison

Одно из значений перечисления, определяющее используемые при сравнении правила.

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

Хэш-код в виде 32-разрядного целого числа со знаком.

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

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Standard 2.1

GetHashCode(ReadOnlySpan<Char>)

Исходный код:
String.Comparison.cs
Исходный код:
String.Comparison.cs
Исходный код:
String.Comparison.cs

Возвращает хэш-код для предоставленного диапазона символов, доступного только для чтения.

public static int GetHashCode (ReadOnlySpan<char> value);

Параметры

value
ReadOnlySpan<Char>

Диапазон символов только для чтения.

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

Хэш-код в виде 32-разрядного целого числа со знаком.

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

.NET 9 и другие версии
Продукт Версии
.NET Core 3.0, Core 3.1, 5, 6, 7, 8, 9

GetHashCode()

Исходный код:
String.Comparison.cs
Исходный код:
String.Comparison.cs
Исходный код:
String.Comparison.cs

Возвращает хэш-код для этой строки.

public override int GetHashCode ();

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

Хэш-код в виде 32-разрядного целого числа со знаком.

Примеры

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

using System;

class GetHashCode 
{
    public static void Main() 
    {
        DisplayHashCode( "" );
        DisplayHashCode( "a" );
        DisplayHashCode( "ab" );
        DisplayHashCode( "abc" );
        DisplayHashCode( "abd" );
        DisplayHashCode( "abe" );
        DisplayHashCode( "abcdef" );
        DisplayHashCode( "abcdeg" );
        DisplayHashCode( "abcdeh" );
        DisplayHashCode( "abcdei" );
        DisplayHashCode( "Abcdeg" );
        DisplayHashCode( "Abcdeh" );
        DisplayHashCode( "Abcdei" );
    }

    static void DisplayHashCode( String Operand )
    {
        int     HashCode = Operand.GetHashCode( );
        Console.WriteLine("The hash code for \"{0}\" is: 0x{1:X8}, {1}",
                          Operand, HashCode );
    }
}
/*
      This example displays output like the following:
      The hash code for "" is: 0x2D2816FE, 757602046
      The hash code for "a" is: 0xCDCAB7BF, -842352705
      The hash code for "ab" is: 0xCDE8B7BF, -840386625
      The hash code for "abc" is: 0x2001D81A, 536991770
      The hash code for "abd" is: 0xC2A94CB5, -1029092171
      The hash code for "abe" is: 0x6550C150, 1699791184
      The hash code for "abcdef" is: 0x1762906D, 392335469
      The hash code for "abcdeg" is: 0x1763906D, 392401005
      The hash code for "abcdeh" is: 0x175C906D, 391942253
      The hash code for "abcdei" is: 0x175D906D, 392007789
      The hash code for "Abcdeg" is: 0x1763954D, 392402253
      The hash code for "Abcdeh" is: 0x175C954D, 391943501
      The hash code for "Abcdei" is: 0x175D954D, 392009037
*/

Комментарии

Поведение GetHashCode зависит от его реализации, которая может измениться с одной версии среды CLR на другую. Причина, по которой это может произойти, заключается в повышении производительности GetHashCode.

Важно!

Если два строковых объекта равны, метод возвращает одинаковые GetHashCode значения. Однако для каждого уникального строкового значения нет уникального значения хэш-кода. Разные строки могут возвращать один и тот же хэш-код.

Стабильность хэш-кода не гарантируется. Хэш-коды для идентичных строк могут отличаться в реализациях .NET, в разных версиях .NET и на разных платформах .NET (например, 32- и 64-разрядных) для одной версии .NET. В некоторых случаях они могут отличаться даже в разных доменах приложения. Это означает, что два последующих запуска одной программы могут возвращать разные хэш-коды.

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

Наконец, не используйте хэш-код вместо значения, возвращаемого криптографической хэш-функцией, если требуется криптографически сильный хэш. Для криптографических хэшей используйте класс, производный от System.Security.Cryptography.HashAlgorithm класса или System.Security.Cryptography.KeyedHashAlgorithm .

Дополнительные сведения о хэш-кодах см. в разделе Object.GetHashCode.

В платформа .NET Framework классических приложениях можно использовать <элемент UseRandomizedStringHashAlgorithm> для создания уникальных хэш-кодов для каждого домена приложения. Это может уменьшить количество конфликтов и повысить общую производительность вставок и подстановок, использующих хэш-таблицы. В следующем примере показано, как использовать <элемент UseRandomizedStringHashAlgorithm>. Он определяет DisplayString класс, включающий частную строковую константу s, значение которой равно "This is a string". Он также включает ShowStringHashCode метод, который отображает строковое значение и его хэш-код вместе с именем домена приложения, в котором выполняется метод.

using System;

public class Example
{
   public static void Main()
   {
      // Show hash code in current domain.
      DisplayString display = new DisplayString();
      display.ShowStringHashCode();
      
      // Create a new app domain and show string hash code.
      AppDomain domain = AppDomain.CreateDomain("NewDomain");
      var display2 = (DisplayString) domain.CreateInstanceAndUnwrap(typeof(Example).Assembly.FullName, 
                                                          "DisplayString");   
      display2.ShowStringHashCode();
   }
}

public class DisplayString : MarshalByRefObject
{
   private String s = "This is a string.";
   
   public override bool Equals(Object obj)
   {
      String s2 = obj as String; 
      if (s2 == null)
         return false;
      else
         return s == s2; 
   }

   public bool Equals(String str)
   {
      return s == str;
   }    
   
   public override int GetHashCode()
   {
      return s.GetHashCode();
   }
   
   public override String ToString() 
   {
      return s;
   }

   public void ShowStringHashCode()
   {
      Console.WriteLine("String '{0}' in domain '{1}': {2:X8}",
                        s, AppDomain.CurrentDomain.FriendlyName, 
                        s.GetHashCode());
   }
}

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

String 'This is a string.' in domain 'PerDomain.exe': 941BCEAC
String 'This is a string.' in domain 'NewDomain': 941BCEAC

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

<?xml version ="1.0"?>
<configuration>
   <runtime>
      <UseRandomizedStringHashAlgorithm enabled="1" />
   </runtime>
</configuration>

Если файл конфигурации существует, пример отображает следующие выходные данные:

String 'This is a string.' in domain 'PerDomain.exe': 5435776D
String 'This is a string.' in domain 'NewDomain': 75CC8236

Важно!

Хэш-коды используются для эффективной вставки и извлечения ключевых объектов из хэш-таблиц. Однако хэш-коды не однозначно определяют строки. Идентичные строки имеют одинаковые хэш-коды, но среда CLR также может назначить один и тот же хэш-код разным строкам. Кроме того, хэш-коды могут различаться в зависимости от версии .NET, платформы в одной версии и домена приложения. Поэтому не следует сериализовать или сохранять значения хэш-кода, а также использовать их в качестве ключей в хэш-таблице или словаре.

Дополнительные сведения об использовании хэш-кодов и метода см. в GetHashCode разделе Object.GetHashCode.

Примечания для тех, кто вызывает этот метод

Значение, возвращаемое параметром GetHashCode() , зависит от платформы. Он отличается на 32-разрядных и 64-разрядных версиях платформа .NET Framework. Она также может отличаться в разных версиях платформа .NET Framework и .NET Core.

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

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

.NET 9 и другие версии
Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0