<Элемент UseRandomizedStringHashAlgorithm>

Определяет, вычисляет ли среда CLR хэш-коды строк для каждого домена приложения.

<Конфигурации>
  <Среды выполнения>
    <UseRandomizedStringHashAlgorithm>

Синтаксис

<UseRandomizedStringHashAlgorithm
   enabled=0|1 />  

Атрибуты и элементы

В следующих разделах описаны атрибуты, дочерние и родительские элементы.

Атрибуты

Атрибут Описание
enabled Обязательный атрибут.

Указывает, вычисляются ли хэш-коды для строк на основе каждого домена приложения.

Атрибут enabled

Значение Описание
0 Среда CLR не вычисляет хэш-коды для строк на основе домена приложения; Для вычисления строковых хэш-кодов используется один алгоритм. Это значение по умолчанию.
1 Среда CLR вычисляет хэш-коды строк для каждого домена приложения. Идентичные строки в разных доменах приложений и в разных процессах будут иметь разные хэш-коды.

Дочерние элементы

Отсутствует.

Родительские элементы

Элемент Описание
configuration Корневой элемент в любом файле конфигурации, используемом средой CLR и приложениями .NET Framework.
runtime Содержит сведения о параметрах инициализации среды выполнения.

Комментарии

По умолчанию класс и String.GetHashCode метод используют один алгоритм хэширования, StringComparer который создает согласованный хэш-код в разных доменах приложений. Это эквивалентно присвоению enabled атрибуту <UseRandomizedStringHashAlgorithm> элемента значения 0. Это алгоритм хэширования, используемый в платформа .NET Framework 4.

Класс StringComparer и String.GetHashCode метод также могут использовать другой алгоритм хэширования, который вычисляет хэш-коды для каждого домена приложения. В результате хэш-коды эквивалентных строк будут отличаться в разных доменах приложений. Это функция согласия; Чтобы воспользоваться его преимуществами, необходимо задать enabled атрибуту <UseRandomizedStringHashAlgorithm> элемента значение 1.

Поиск строк в хэш-таблице обычно является операцией O(1). Однако при возникновении большого количества конфликтов поиск может стать операцией O(n2). Элемент конфигурации можно использовать для <UseRandomizedStringHashAlgorithm> создания алгоритма случайного хэширования для каждого домена приложения, который, в свою очередь, ограничивает количество потенциальных конфликтов, особенно если ключи, из которых вычисляются хэш-коды, основаны на данных, введенных пользователями.

Пример

В следующем примере определяется DisplayString класс, включающий частную строковую константу s, значение которой равно "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  

См. также раздел