次の方法で共有


<UseRandomizedStringHashAlgorithm> 要素

共通言語ランタイムが、アプリケーション ドメインごとに文字列のハッシュ コードを計算するかどうかを決定します。

<構成>
   <実行中>
     <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

こちらも参照ください