共用方式為


<UseRandomizedStringHashAlgorithm> 要素

判斷通用語言執行時是否依每個應用域計算字串的雜湊碼。

<組態>
   <運行時間>
     <使用隨機字串雜湊演算法>

語法

<UseRandomizedStringHashAlgorithm
   enabled=0|1 />

屬性和項目

下列章節說明屬性、子元素和父元素。

Attributes

Attribute Description
enabled 必要屬性。

規定字串的雜湊碼是否依每個應用域計算。

啟用屬性

價值觀 Description
0 通用語言執行時不會針對每個應用域計算字串的雜湊碼;計算字串雜湊碼時使用單一演算法。 這是預設值。
1 通用語言執行時會依每個應用域計算字串的雜湊碼。 不同應用領域和不同程序中的相同字串會有不同的雜湊碼。

子元素

沒有。

父項目

元素 Description
configuration 通用語言執行平台和 .NET Framework 應用程式所使用之每個組態檔中的根項目。
runtime 包含有關執行階段初始化選項的資訊。

備註

預設情況下,類別 StringComparerString.GetHashCode 方法使用單一雜湊演算法,能在不同應用域產生一致的雜湊碼。 這等同於將元素屬性<UseRandomizedStringHashAlgorithm>enabled0。 這就是 .NET Framework 4 中使用的雜湊演算法。

類別 StringComparerString.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

另請參閱