String.GetHashCode 方法

定义

重载

GetHashCode(ReadOnlySpan<Char>, StringComparison)

使用指定的规则返回所提供的只读字符范围的哈希代码。

GetHashCode(StringComparison)

使用指定的规则返回此字符串的哈希代码。

GetHashCode(ReadOnlySpan<Char>)

返回所提供的只读字符范围的哈希代码。

GetHashCode()

返回该字符串的哈希代码。

GetHashCode(ReadOnlySpan<Char>, StringComparison)

Source:
String.Comparison.cs
Source:
String.Comparison.cs
Source:
String.Comparison.cs

使用指定的规则返回所提供的只读字符范围的哈希代码。

C#
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)

Source:
String.Comparison.cs
Source:
String.Comparison.cs
Source:
String.Comparison.cs

使用指定的规则返回此字符串的哈希代码。

C#
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>)

Source:
String.Comparison.cs
Source:
String.Comparison.cs
Source:
String.Comparison.cs

返回所提供的只读字符范围的哈希代码。

C#
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()

Source:
String.Comparison.cs
Source:
String.Comparison.cs
Source:
String.Comparison.cs

返回该字符串的哈希代码。

C#
public override int GetHashCode ();

返回

32 位有符号整数哈希代码。

示例

以下示例使用各种输入字符串演示 GetHashCode 方法。

C#
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 取决于其实现,后者可能会从公共语言运行时的一个版本更改为另一个版本。 发生这种情况的一个原因是为了提高 的性能 GetHashCode

重要

如果两个字符串对象相等,该方法 GetHashCode 将返回相同的值。 但是,对于每个唯一字符串值,没有唯一的哈希代码值。 不同的字符串可以返回相同的哈希代码。

不保证哈希代码本身是稳定的。 同一字符串的哈希代码可能因 .NET 实现、.NET 版本和 .NET 平台 ((例如 32 位和 64 位) )而不同。 在某些情况下,它们甚至可能因应用程序域而异。 这意味着同一程序的两个后续运行可能会返回不同的哈希代码。

因此,不应在创建哈希代码的应用程序域之外使用哈希代码,也不应将其用作集合中的键字段,也不应持久保存它们。

最后,如果需要加密强哈希,请不要使用哈希代码而不是加密哈希函数返回的值。 对于加密哈希,请使用派生自 或 System.Security.Cryptography.KeyedHashAlgorithm 类的System.Security.Cryptography.HashAlgorithm类。

有关哈希代码的详细信息,请参阅 Object.GetHashCode

在.NET Framework桌面应用中,可以使用 <UseRandomizedStringHashAlgorithm> 元素基于每个应用程序域生成唯一的哈希代码。 这可以减少冲突次数,并提高使用哈希表的插入和查找的整体性能。 以下示例演示如何使用 <UseRandomizedStringHashAlgorithm> 元素。 它定义了一个 DisplayString 类, s该类包含一个私有字符串常量 ,其值为“这是一个字符串”。它还包含一个 ShowStringHashCode 方法,该方法显示字符串值及其哈希代码以及执行方法的应用程序域的名称。

C#
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
<?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

重要

哈希代码用于有效地从哈希表中插入和检索键控对象。 但是,哈希代码不唯一标识字符串。 相同的字符串具有相等的哈希代码,但公共语言运行时也可以将相同的哈希代码分配给不同的字符串。 此外,哈希代码可能因 .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