确定公共语言运行时是否基于每个应用程序域计算字符串的哈希代码。
<配置>
<运行时>
<UseRandomizedStringHashAlgorithm>
Syntax
<UseRandomizedStringHashAlgorithm
enabled=0|1 />
特性和元素
下列各节描述了特性、子元素和父元素。
特性
| Attribute | Description |
|---|---|
enabled |
必需属性。 指定是否为每个应用程序域计算字符串的哈希代码。 |
enabled Attribute
| 价值 | Description |
|---|---|
0 |
公共语言运行时不会为每个应用程序域计算字符串的哈希代码;单个算法用于计算字符串哈希代码。 这是默认情况。 |
1 |
公共语言运行时根据每个应用程序域计算字符串的哈希代码。 不同应用程序域中和不同进程中的相同字符串将具有不同的哈希代码。 |
子元素
没有。
父元素
| 元素 | Description |
|---|---|
configuration |
公共语言运行时和 .NET Framework 应用程序所使用的每个配置文件中的根元素。 |
runtime |
包含有关运行时初始化选项的信息。 |
注解
默认情况下, StringComparer 类和 String.GetHashCode 方法使用单个哈希算法,该算法在应用程序域中生成一致的哈希代码。 这等效于将enabled<UseRandomizedStringHashAlgorithm>元素的属性设置为 0. 这是 .NET Framework 4 中使用的哈希算法。
该 StringComparer 类和 String.GetHashCode 方法还可以使用不同的哈希算法,该算法基于每个应用程序域计算哈希代码。 因此,等效字符串的哈希代码会因应用程序域而异。 这是一项选择加入功能;若要利用它,必须将元素的属性<UseRandomizedStringHashAlgorithm>设置为 enabled1。
哈希表中的字符串查找通常是 O(1)作。 但是,当发生大量冲突时,查找可能会成为 O(n2)作。 可以使用 <UseRandomizedStringHashAlgorithm> 配置元素为每个应用程序域生成随机哈希算法,这反过来会限制潜在冲突的数量,尤其是在计算哈希代码的键基于用户的数据输入时。
Example
以下示例定义一个 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 '{s}' in domain '{AppDomain.CurrentDomain.FriendlyName}': {s.GetHashCode():X8}");
}
}
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