<Userandomizedstringhashalgorithm,那么 > 元素<UseRandomizedStringHashAlgorithm> Element

确定公共语言运行时是否在计算字符串的哈希代码每个应用程序域。Determines whether the common language runtime calculates hash codes for strings on a per application domain basis.

<configuration><configuration>
<运行时 ><runtime>
<UseRandomizedStringHashAlgorithm><UseRandomizedStringHashAlgorithm>

语法Syntax

<UseRandomizedStringHashAlgorithm   
   enabled=0|1 />  

特性和元素Attributes and Elements

下列各节描述了特性、子元素和父元素。The following sections describe attributes, child elements, and parent elements.

特性Attributes

特性Attribute 描述Description
enabled 必需的特性。Required attribute.

指定字符串的哈希代码计算每个应用程序域。Specifies whether hash codes for strings are calculated on a per application domain basis.

enabled 特性enabled Attribute

Value 描述Description
0 公共语言运行时不会计算字符串的哈希代码对每个应用程序域;使用单个算法来计算字符串哈希代码。The common language runtime does not compute hash codes for strings on a per application domain basis; a single algorithm is used to calculate string hash codes. 这是默认设置。This is the default.
1 公共语言运行时计算字符串的哈希代码对每个应用程序域。The common language runtime computes hash codes for strings on a per application domain basis. 在不同应用程序域和不同进程中的相同字符串将具有不同的哈希代码。Identical strings in different application domains and in different processes will have different hash codes.

子元素Child Elements

无。None.

父元素Parent Elements

元素Element 描述Description
configuration 公共语言运行时和 .NET Framework 应用程序所使用的每个配置文件中的根元素。The root element in every configuration file used by the common language runtime and .NET Framework applications.
runtime 包含有关运行时初始化选项的信息。Contains information about runtime initialization options.

备注Remarks

默认情况下StringComparer类和String.GetHashCode方法使用跨应用程序域生成一致的哈希代码的单个哈希算法。By default, the StringComparer class and the String.GetHashCode method use a single hashing algorithm that produces a consistent hash code across application domains. 这相当于设置enabled的属性<UseRandomizedStringHashAlgorithm>元素0This is equivalent to setting the enabled attribute of the <UseRandomizedStringHashAlgorithm> element to 0. 这是在.NET Framework 4 中使用的哈希算法。This is the hashing algorithm used in the .NET Framework 4.

StringComparer类和String.GetHashCode方法还可以使用不同的哈希算法计算哈希代码对每个应用程序域。The StringComparer class and the String.GetHashCode method can also use a different hashing algorithm that computes hash codes on a per application domain basis. 因此,等效的字符串的哈希代码将不同跨应用程序域。As a result, hash codes for equivalent strings will differ across application domains. 这是一项选择加入的功能;若要充分利用它,必须设置enabled的属性<UseRandomizedStringHashAlgorithm>元素1This is an opt-in feature; to take advantage of it, you must set the enabled attribute of the <UseRandomizedStringHashAlgorithm> element to 1.

哈希表中的字符串查找通常是 o (1) 的操作。The string lookup in a hash table is typically an O(1) operation. 但是,大量冲突发生时,查找会变为 O (n2) 操作。However, when a large number of collisions occur, the lookup can become an O(n2) operation. 可以使用<UseRandomizedStringHashAlgorithm>要生成随机的哈希算法,每个应用程序域,从而限制潜在冲突数量,尤其是在从其计算哈希代码的密钥根据数据输入时配置元素由用户。You can use the <UseRandomizedStringHashAlgorithm> configuration element to generate a random hashing algorithm per application domain, which in turn limits the number of potential collisions, particularly when the keys from which the hash codes are calculated are based on data input by users.

示例Example

下面的示例定义DisplayString类,其中包含私有字符串常量, s,其值是"这是一个字符串"。The following example 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  

请参阅See also