分享方式:


<UseRandomizedStringHashAlgorithm> 元素

判斷 Common Language Runtime 是否根據應用程式定義域來計算字串的雜湊碼。

<configuration>
  <runtime>
    <UseRandomizedStringHashAlgorithm>

Syntax

<UseRandomizedStringHashAlgorithm
   enabled=0|1 />  

屬性和項目

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

屬性

屬性 描述
enabled 必要屬性。

指定是否根據應用程式定義域來計算字串的雜湊碼。

啟用屬性

描述
0 Common Language Runtime 不會根據應用程式定義域來計算字串的雜湊碼;會使用單一演算法來計算字串雜湊碼。 此為預設值。
1 Common Language Runtime 會根據應用程式定義域來計算字串的雜湊碼。 不同應用程式定義域和不同程序中的相同字串將會有不同的雜湊碼。

子元素

無。

父項目

元素 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> 設定元素以產生每個應用程式定義域的隨機雜湊演算法,進而限制潛在衝突數目,特別是從中計算雜湊碼的索引鍵根據使用者的資料輸入時。

範例

下列範例會定義包括私人字串常數 s 的類別 DisplayString,其值為 "This is a string"。它也會包括 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 '{0}' in domain '{1}': {2:X8}",
                        s, AppDomain.CurrentDomain.FriendlyName,
                        s.GetHashCode());
   }
}
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  

另請參閱