本文由机器翻译。若要查看英语原文,请勾选“英语”复选框。 也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。
翻译
英语

String.GetHashCode 方法 ()

 

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

命名空间:   System
程序集:  mscorlib(位于 mscorlib.dll)

public override int GetHashCode()

返回值

Type: System.Int32

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

行为GetHashCode依赖于其实现中,这可能从一个版本的公共语言运行时更改到另一个。 这种情况的原因是提高的性能GetHashCode

System_CAPS_important重要事项

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

哈希代码本身不被保证保持不变。 跨版本的.NET Framework 和跨平台 (例如 32 位和 64 位) 的单个版本的.NET framework,可以与不同相同字符串的哈希代码。 在某些情况下,它们可以甚至不同由应用程序域。

因此,哈希代码应永远不会使用在其中创建了它们,应用程序域之外客户应永远不会使用作为集合中的键字段,并应永远不会保留它们。

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

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

在桌面应用,你可以使用<UseRandomizedStringHashAlgorithm>元素上生成唯一哈希代码按应用程序域。</UseRandomizedStringHashAlgorithm> 这可以减少冲突数量,并改进的插入和使用哈希表查找的总体性能。 下面的示例演示如何使用<UseRandomizedStringHashAlgorithm>元素。</UseRandomizedStringHashAlgorithm> 它定义为在生成唯一哈希代码按应用程序域。 这可以减少冲突数量,并改进的插入和使用哈希表查找的总体性能。 下面的示例演示如何使用。 它定义DisplayString类,包含私有字符串常量, s,其值是"这是一个字符串。" 它还包括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

System_CAPS_important重要事项

哈希代码用于插入和有效地从哈希表中检索键控的对象。 但是,哈希代码不唯一地标识字符串。 相同的字符串具有相等的哈希代码,但公共语言运行时还可以为不同的字符串分配相同的哈希代码。 此外,哈希代码而异的.NET framework 的版本、 中的单个版本平台以及应用程序域。 因此,不应序列化,或保留哈希代码值,也不应使用它们作为哈希表或字典中的键。

有关使用哈希代码的其他信息和GetHashCode方法,请参阅Object.GetHashCode

调用函数说明:

返回的值GetHashCode是与平台相关。 它不同于.NET Framework 的 32 位和 64 位版本不同。 它还可以与不同,.NET Framework 各版本之间。

System_CAPS_warning警告

哈希代码旨在高效插入和基于哈希表的集合中查找。 哈希代码不是永久的值。 出于此原因︰

下面的示例演示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
*/

通用 Windows 平台
自 8 起可用
.NET Framework
自 1.1 起可用
可移植类库
可移植 .NET 平台 中受支持
Silverlight
自 2.0 起可用
Windows Phone Silverlight
自 7.0 起可用
Windows Phone
自 8.1 起可用
返回页首
显示: