判斷通用語言執行時是否依每個應用域計算字串的雜湊碼。
語法
<UseRandomizedStringHashAlgorithm
enabled=0|1 />
屬性和項目
下列章節說明屬性、子元素和父元素。
Attributes
| Attribute | Description |
|---|---|
enabled |
必要屬性。 規定字串的雜湊碼是否依每個應用域計算。 |
啟用屬性
| 價值觀 | Description |
|---|---|
0 |
通用語言執行時不會針對每個應用域計算字串的雜湊碼;計算字串雜湊碼時使用單一演算法。 這是預設值。 |
1 |
通用語言執行時會依每個應用域計算字串的雜湊碼。 不同應用領域和不同程序中的相同字串會有不同的雜湊碼。 |
子元素
沒有。
父項目
| 元素 | Description |
|---|---|
configuration |
通用語言執行平台和 .NET Framework 應用程式所使用之每個組態檔中的根項目。 |
runtime |
包含有關執行階段初始化選項的資訊。 |
備註
預設情況下,類別 StringComparer 與 String.GetHashCode 方法使用單一雜湊演算法,能在不同應用域產生一致的雜湊碼。 這等同於將元素屬性<UseRandomizedStringHashAlgorithm>設enabled為 0。 這就是 .NET Framework 4 中使用的雜湊演算法。
類別 StringComparer 與 String.GetHashCode 方法也可使用不同的雜湊演算法,依每個應用域計算雜湊碼。 因此,等效字串的雜湊碼會在不同應用領域間有所不同。 這是一個選擇加入的功能;要利用它,你必須將元素的<UseRandomizedStringHashAlgorithm>屬性設enabled為 1。
雜湊表中的字串查找通常為 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