<UseRandomizedStringHashAlgorithm> 元素

确定公共语言运行时是否按应用程序域计算字符串的哈希代码。

configuration
  runtime
    <UseRandomizedStringHashAlgorithm>

语法

<UseRandomizedStringHashAlgorithm
   enabled=0|1 />  

特性和元素

下列各节描述了特性、子元素和父元素。

特性

属性 描述
enabled 必需的特性。

指定是否按应用程序域计算字符串的哈希代码。

enabled 特性

说明
0 公共语言运行时不会为每个应用程序域计算字符串的哈希代码;单个算法用于计算字符串哈希代码。 这是默认值。
1 公共语言运行时按应用程序域计算字符串的哈希代码。 不同应用程序域和不同进程中的相同字符串具有不同的哈希代码。

子元素

无。

父元素

元素 说明
configuration 公共语言运行时和 .NET Framework 应用程序所使用的每个配置文件中的根元素。
runtime 包含有关运行时初始化选项的信息。

备注

默认情况下,StringComparer 类和 String.GetHashCode 方法使用单个哈希算法,而该算法可跨应用程序域生成一致的哈希代码。 这等效于将 <UseRandomizedStringHashAlgorithm> 元素的 enabled 属性设为 0。 这是 .NET Framework 4 中使用的哈希算法。

StringComparer 类和 String.GetHashCode 方法也可以使用不同的哈希算法来计算每个应用程序域的哈希代码。 因此,相同字符串的哈希代码将在应用程序域之间有所不同。 这是一项可选功能;若要利用它,必须将 <UseRandomizedStringHashAlgorithm> 元素的 enabled 属性设为 1

哈希表中的字符串查找通常是 O(1) 操作。 但是,当发生大量冲突时,查找可能会成为 O (n2) 操作。 可以使用 <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());
   }
}
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

当您在未提供配置文件的情况下运行该示例时,它会显示类似下面的输出。 请注意,字符串的散列码在两个应用程序域中是相同的。

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  

请参阅