String.GetHashCode 方法

定义

重载

GetHashCode(ReadOnlySpan<Char>, StringComparison)

使用指定的规则返回所提供的只读字符范围的哈希代码。Returns the hash code for the provided read-only character span using the specified rules.

GetHashCode(StringComparison)

使用指定的规则返回此字符串的哈希代码。Returns the hash code for this string using the specified rules.

GetHashCode()

返回该字符串的哈希代码。Returns the hash code for this string.

GetHashCode(ReadOnlySpan<Char>)

返回所提供的只读字符范围的哈希代码。Returns the hash code for the provided read-only character span.

GetHashCode(ReadOnlySpan<Char>, StringComparison)

使用指定的规则返回所提供的只读字符范围的哈希代码。Returns the hash code for the provided read-only character span using the specified rules.

public:
 static int GetHashCode(ReadOnlySpan<char> value, StringComparison comparisonType);
public static int GetHashCode (ReadOnlySpan<char> value, StringComparison comparisonType);
static member GetHashCode : ReadOnlySpan<char> * StringComparison -> int
Public Shared Function GetHashCode (value As ReadOnlySpan(Of Char), comparisonType As StringComparison) As Integer

参数

value
ReadOnlySpan<Char>

一个只读字符范围。A read-only character span.

comparisonType
StringComparison

一个枚举值,用于指定比较中要使用的规则。One of the enumeration values that specifies the rules to use in the comparison.

返回

32 位有符号整数哈希代码。A 32-bit signed integer hash code.

GetHashCode(StringComparison)

使用指定的规则返回此字符串的哈希代码。Returns the hash code for this string using the specified rules.

public:
 int GetHashCode(StringComparison comparisonType);
public int GetHashCode (StringComparison comparisonType);
override this.GetHashCode : StringComparison -> int
Public Function GetHashCode (comparisonType As StringComparison) As Integer

参数

comparisonType
StringComparison

一个枚举值,用于指定比较中要使用的规则。One of the enumeration values that specifies the rules to use in the comparison.

返回

32 位有符号整数哈希代码。A 32-bit signed integer hash code.

GetHashCode()

返回该字符串的哈希代码。Returns the hash code for this string.

public:
 override int GetHashCode();
public override int GetHashCode ();
override this.GetHashCode : unit -> int
Public Overrides Function GetHashCode () As Integer

返回

32 位有符号整数哈希代码。A 32-bit signed integer hash code.

示例

下面的示例演示使用各种输入字符串的 GetHashCode 方法。The following example demonstrates the GetHashCode method using various input strings.

using namespace System;

void DisplayHashCode( String^ Operand )
{
   int HashCode = Operand->GetHashCode();
   Console::WriteLine( "The hash code for \"{0}\" is: 0x{1:X8}, {1}", Operand, HashCode );
}

int 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" );
}

/*
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
*/
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
*/
Module GetHashCode
    Sub 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")
    End Sub
       
    Sub DisplayHashCode(Operand As String)
        Dim HashCode As Integer = Operand.GetHashCode()
        Console.WriteLine("The hash code for ""{0}"" is: 0x{1:X8}, {1}", 
                          Operand, HashCode)
    End Sub 
End Module 
' 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 的行为取决于其实现,这可能会从公共语言运行时的一个版本更改为另一个版本。The behavior of GetHashCode is dependent on its implementation, which might change from one version of the common language runtime to another. 导致这种情况的原因是提高 GetHashCode的性能。A reason why this might happen is to improve the performance of GetHashCode.

重要

如果两个字符串对象相等,则 GetHashCode 方法返回相同的值。If two string objects are equal, the GetHashCode method returns identical values. 但是,每个唯一字符串值没有唯一的哈希代码值。However, there is not a unique hash code value for each unique string value. 不同的字符串可以返回相同的哈希代码。Different strings can return the same hash code.

哈希代码本身不一定是稳定的。The hash code itself is not guaranteed to be stable. 对于单个版本的 .NET,相同字符串的哈希代码可能跨 .net 实现、跨 .NET 版本和跨 .NET 平台(如32位和64位)不同。Hash codes for identical strings can differ across .NET implementations, across .NET versions, and across .NET platforms (such as 32-bit and 64-bit) for a single version of .NET. 在某些情况下,它们甚至不同于应用程序域。In some cases, they can even differ by application domain. 这意味着,同一程序的两次后续运行可能返回不同的哈希代码。This implies that two subsequent runs of the same program may return different hash codes.

因此,哈希代码决不能在创建它们的应用程序域的外部使用,它们永远不应用作集合中的键字段,它们永远不会保留。As a result, hash codes should never be used outside of the application domain in which they were created, they should never be used as key fields in a collection, and they should never be persisted.

最后,如果需要加密型强哈希,请不要使用哈希代码(而不是加密哈希函数返回的值)。Finally, don't use the hash code instead of a value returned by a cryptographic hashing function if you need a cryptographically strong hash. 对于加密哈希,请使用派生自 System.Security.Cryptography.HashAlgorithmSystem.Security.Cryptography.KeyedHashAlgorithm 类的类。For cryptographic hashes, use a class derived from the System.Security.Cryptography.HashAlgorithm or System.Security.Cryptography.KeyedHashAlgorithm class.

有关哈希代码的详细信息,请参阅 Object.GetHashCodeFor more information about hash codes, see Object.GetHashCode.

在桌面应用程序中,可以使用<UseRandomizedStringHashAlgorithm > 元素基于每个应用程序域生成唯一的哈希代码。In desktop apps, you can use the <UseRandomizedStringHashAlgorithm> element to generate unique hash codes on a per application domain basis. 这可以减少冲突数,并改善使用哈希表的插入和查找的整体性能。This can reduce the number of collisions and improve the overall performance of insertions and lookups that use hash tables. 下面的示例演示如何使用<UseRandomizedStringHashAlgorithm > 元素The following example shows how to use the <UseRandomizedStringHashAlgorithm> element. 它定义一个 DisplayString 类,该类包含一个专用字符串常量,s,其值为 "This is a string"。It defines a DisplayString class that includes a private string constant, s, whose value is "This is a string." 它还包括显示字符串值及其哈希代码的 ShowStringHashCode 方法以及该方法在其中执行的应用程序域的名称。It also includes a ShowStringHashCode method that displays the string value and its hash code along with the name of the application domain in which the method is executing.

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());
   }
}
Module Example
   Public Sub Main()
      ' Show hash code in current domain.
      Dim display As New DisplayString()
      display.ShowStringHashCode()
      
      ' Create a new app domain and show string hash code.
      Dim domain As AppDomain = AppDomain.CreateDomain("NewDomain")
      Dim display2 = CType(domain.CreateInstanceAndUnwrap(GetType(Example).Assembly.FullName, 
                                                          "DisplayString"), DisplayString)   
      display2.ShowStringHashCode()
   End Sub
End Module

Public Class DisplayString : Inherits MarshalByRefObject

   Private s As String = "This is a string."
   
   Public Overrides Function Equals(obj As Object) As Boolean
      Dim s2 As String = TryCast(obj, String)
      If s2 Is Nothing Then
         Return False
      Else
         Return s = s2 
      End If
   End Function

   Public Overloads Function Equals(str As String) As Boolean
      Return s = str
   End Function    
   
   Public Overrides Function GetHashCode() As Integer
      Return s.GetHashCode()
   End Function
   
   Public Overrides Function ToString() As String
      Return s
   End Function

   Public Sub ShowStringHashCode()
      Console.WriteLine("String '{0}' in domain '{1}': {2:X8}",
                        s, AppDomain.CurrentDomain.FriendlyName, 
                        s.GetHashCode())
   End Sub
End Class

当您在未提供配置文件的情况下运行该示例时,它会显示类似下面的输出。When you run the example without supplying a configuration file, it displays output similar to the following. 请注意,字符串的散列码在两个应用程序域中是相同的。Note that the hash codes for the string are identical in the two application domains.

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

但是,如果将以下配置文件添加到示例目录,然后运行该示例,则同一个字符串的哈希代码将通过应用程序域进行区分。However, if you add the following configuration file to the example's directory and then run the example, the hash codes for the same string will differ by application domain.

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

存在配置文件时,示例会显示以下输出:When the configuration file is present, the example displays the following output:

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

重要

哈希代码用于有效地从哈希表中插入和检索密钥对象。Hash codes are used to insert and retrieve keyed objects from hash tables efficiently. 但哈希代码不能唯一标识字符串。However, hash codes don't uniquely identify strings. 相同的字符串具有相同的哈希代码,但公共语言运行时还可以将相同的哈希代码分配给不同的字符串。Identical strings have equal hash codes, but the common language runtime can also assign the same hash code to different strings. 此外,哈希代码可根据 .NET 版本、单个版本内的平台和应用程序域的不同而不同。In addition, hash codes can vary by version of .NET, by platform within a single version, and by application domain. 因此,不应序列化或保留哈希代码值,也不应将其用作哈希表或字典中的键。Because of this, you should not serialize or persist hash code values, nor should you use them as keys in a hash table or dictionary.

有关哈希代码和 GetHashCode 方法的使用的其他信息,请参阅 Object.GetHashCodeFor additional information about the use of hash codes and the GetHashCode method, see Object.GetHashCode.

调用方说明

GetHashCode() 返回的值与平台相关。The value returned by GetHashCode() is platform-dependent. 它在 .NET Framework 的32位和64位版本上有所不同。It differs on the 32-bit and 64-bit versions of the .NET Framework. 它还可能在不同版本的 .NET Framework 和 .NET Core 之间有所不同。It also can differ between versions of the .NET Framework and .NET Core.

另请参阅

GetHashCode(ReadOnlySpan<Char>)

返回所提供的只读字符范围的哈希代码。Returns the hash code for the provided read-only character span.

public:
 static int GetHashCode(ReadOnlySpan<char> value);
public static int GetHashCode (ReadOnlySpan<char> value);
static member GetHashCode : ReadOnlySpan<char> -> int
Public Shared Function GetHashCode (value As ReadOnlySpan(Of Char)) As Integer

参数

value
ReadOnlySpan<Char>

一个只读字符范围。A read-only character span.

返回

32 位有符号整数哈希代码。A 32-bit signed integer hash code.

适用于