导出 (0) 打印
全部展开
此文章由机器翻译。 将光标移到文章的句子上,以查看原文。 更多信息。
译文
原文

String.GetHashCode 方法

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

命名空间:  System
程序集:  mscorlib(在 mscorlib.dll 中)

public override int GetHashCode()

返回值

类型:System.Int32
32 位有符号整数哈希代码。

GetHashCode 的行为取决于它的实现,此实现可能会从一个公共语言运行时版本更改为另一个版本。 原因可能是为了提高 GetHashCode 的性能。

重要说明重要事项

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

不能保证哈希代码是唯一的。 相同的字符串的哈希代码在 .NET Framework 的不同版本中和跨平台 (如 32 位和 64 位) .NET Framework 的单一版本中可能不同。 有时,因为应用程序域而不同。

因此,哈希代码不应在创建的应用程序域之外使用,不应在集合的关键字段使用,且不应保留。

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

有关哈希代码的更多信息,请参见 Object.GetHashCode

在桌面应用程序中,可以使用 <UseRandomizedStringHashAlgorithm> 元素在每个应用程序域基类型上生成唯一哈希代码。 这可以减少冲突数,提高使用哈希表插入和查找的整体性能。 下面的示例演示如何使用 <UseRandomizedStringHashAlgorithm>元素 定义一个包含私有字符串常量 sDisplayString 类,其值为“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

重要说明重要事项

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

有关使用哈希代码和 GetHashCode 方法的更多信息,请参见 Object.GetHashCode

对调用者的说明

GetHashCode 返回的值与平台相关。 在 32 位和 64 位版本的 .NET Framework 上有所不同。 它还可以根据.NET Framework 的版本不同而不同。

警告说明警告

哈希代码用来在基于哈希表的集合中进行有效的插入和查找。 哈希代码不是一个永久值。 此目的:

  • 不要序列化哈希代码值或将其存储在数据库中。

  • 不要使用哈希代码作为关键字从键控集合中检索对象。

  • 不要使用哈希代码,而是使用加密哈希函数返回的值。 对于加密哈希,请使用来自 System.Security.Cryptography.HashAlgorithmSystem.Security.Cryptography.KeyedHashAlgorithm 类的派生类。

  • 不要测试的哈希代码的相等性来确定两个对象是否相等。(不相等的对象可能有相同的哈希代码。)若要测试相等性,请调用 ReferenceEqualsEquals 方法。

下面的示例使用各种输入字符串演示 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
*/


.NET Framework

受以下版本支持:4.5.2、4.5.1、4.5、4、3.5、3.0、2.0、1.1、1.0

.NET Framework Client Profile

受以下版本支持:4、3.5 SP1

可移植类库

受以下版本支持:可移植类库

适用于 Windows 应用商店应用的 .NET

受以下版本支持:Windows 8

适用于 Windows Phone 应用的 .NET

受以下版本支持:Windows Phone 8、Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服务器核心角色), Windows Server 2008 R2(支持带 SP1 或更高版本的服务器核心角色;不支持 Itanium)

.NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参阅.NET Framework 系统要求

社区附加资源

添加
显示:
© 2015 Microsoft