共通言語ランタイムが、アプリケーション ドメインごとに文字列のハッシュ コードを計算するかどうかを決定します。
<構成>
<実行中>
<UseRandomizedStringHashAlgorithm>
構文
<UseRandomizedStringHashAlgorithm
enabled=0|1 />
属性および要素
以降のセクションでは、属性、子要素、および親要素について説明します。
Attributes
| 特性 | Description |
|---|---|
enabled |
必須の属性。 文字列のハッシュ コードをアプリケーション ドメインごとに計算するかどうかを指定します。 |
enabled 属性
| 価値 | Description |
|---|---|
0 |
共通言語ランタイムは、アプリケーション ドメインごとに文字列のハッシュ コードを計算しません。1 つのアルゴリズムを使用して、文字列ハッシュ コードを計算します。 これが既定値です。 |
1 |
共通言語ランタイムは、アプリケーション ドメインごとに文字列のハッシュ コードを計算します。 異なるアプリケーション ドメインと異なるプロセス内の同一の文字列は、異なるハッシュ コードを持ちます。 |
子要素
なし。
親要素
| 要素 | Description |
|---|---|
configuration |
共通言語ランタイムおよび .NET Framework アプリケーションで使用されるすべての構成ファイルのルート要素です。 |
runtime |
ランタイム初期化オプションに関する情報を含んでいます。 |
注釈
既定では、 StringComparer クラスと String.GetHashCode メソッドは、アプリケーション ドメイン間で一貫したハッシュ コードを生成する 1 つのハッシュ アルゴリズムを使用します。 これは、<UseRandomizedStringHashAlgorithm>要素のenabled属性を0に設定することと同じです。 これは、.NET Framework 4 で使用されるハッシュ アルゴリズムです。
StringComparer クラスと String.GetHashCode メソッドでは、アプリケーション ドメインごとにハッシュ コードを計算する別のハッシュ アルゴリズムを使用することもできます。 その結果、同等の文字列のハッシュ コードは、アプリケーション ドメインによって異なります。 これはオプトイン機能です。これを利用するには、<UseRandomizedStringHashAlgorithm>要素のenabled属性を1に設定する必要があります。
ハッシュ テーブル内の文字列参照は、通常、O(1) 操作です。 ただし、多数の競合が発生した場合、ルックアップは O(n2) 操作になる可能性があります。
<UseRandomizedStringHashAlgorithm>構成要素を使用して、アプリケーション ドメインごとにランダム ハッシュ アルゴリズムを生成できます。これは、特にハッシュ コードの計算元のキーがユーザーによるデータ入力に基づいている場合に、競合の可能性の数を制限します。
Example
次の例では、値が "This is a string" であるプライベート文字列定数 (s) を含むDisplayString クラスを定義します。また、文字列値とそのハッシュ コードを、メソッドが実行されているアプリケーション ドメインの名前と共に表示する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
構成ファイルを指定せずにこの例を実行すると、次のような出力が表示されます。 文字列のハッシュ コードは、2 つのアプリケーション ドメインで同じであることに注意してください。
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