<UseRandomizedStringHashAlgorithm> , element

Określa, czy środowisko uruchomieniowe języka wspólnego oblicza kody skrótów dla ciągów na podstawie domeny aplikacji.

<Konfiguracji>
  <Środowiska wykonawczego>
    <UseRandomizedStringHashAlgorithm>

Składnia

<UseRandomizedStringHashAlgorithm
   enabled=0|1 />  

Atrybuty i elementy

W poniższych sekcjach opisano atrybuty, elementy podrzędne i elementy nadrzędne.

Atrybuty

Atrybut Opis
enabled Atrybut wymagany.

Określa, czy kody skrótów ciągów są obliczane na podstawie domeny aplikacji.

Atrybut włączony

Wartość Opis
0 Środowisko uruchomieniowe języka wspólnego nie oblicza kodów skrótów dla ciągów na domenę aplikacji; Pojedynczy algorytm służy do obliczania kodów skrótów ciągów. Jest to opcja domyślna.
1 Środowisko uruchomieniowe języka wspólnego oblicza kody skrótów ciągów dla poszczególnych domen aplikacji. Identyczne ciągi w różnych domenach aplikacji i w różnych procesach będą miały różne kody skrótów.

Elementy podrzędne

Brak.

Elementy nadrzędne

Element Opis
configuration Element główny w każdym pliku konfiguracji używanym przez środowisko uruchomieniowe języka wspólnego i aplikacje programu .NET Framework.
runtime Zawiera informacje dotyczące opcji inicjowania środowiska uruchomieniowego.

Uwagi

Domyślnie StringComparer klasa i String.GetHashCode metoda używają pojedynczego algorytmu tworzenia skrótów, który tworzy spójny kod skrótu między domenami aplikacji. Jest to równoważne ustawieniu enabled atrybutu <UseRandomizedStringHashAlgorithm> elementu na 0. Jest to algorytm tworzenia skrótów używany w .NET Framework 4.

Klasa StringComparer i String.GetHashCode metoda mogą również używać innego algorytmu tworzenia skrótów, który oblicza kody skrótów na podstawie domeny aplikacji. W związku z tym kody skrótów dla równoważnych ciągów będą się różnić w różnych domenach aplikacji. Jest to funkcja zgody; aby skorzystać z niego, należy ustawić enabled atrybut elementu <UseRandomizedStringHashAlgorithm> na 1.

Wyszukiwanie ciągów w tabeli skrótów jest zazwyczaj operacją O(1). Jednak w przypadku wystąpienia dużej liczby kolizji wyszukiwanie może stać się operacją O(n2). Za pomocą <UseRandomizedStringHashAlgorithm> elementu konfiguracji można wygenerować losowy algorytm wyznaczania wartości skrótu dla domeny aplikacji, który z kolei ogranicza liczbę potencjalnych kolizji, szczególnie gdy klucze, z których są obliczane kody skrótów, są oparte na danych wejściowych przez użytkowników.

Przykład

W poniższym przykładzie zdefiniowano klasę zawierającą stałą DisplayString ciągu prywatnego, sktórej wartością jest "To jest ciąg". Zawiera również metodę ShowStringHashCode , która wyświetla wartość ciągu i jej kod skrótu wraz z nazwą domeny aplikacji, w której jest wykonywane metoda.

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

Po uruchomieniu przykładu bez podawania pliku konfiguracji zostaną wyświetlone dane wyjściowe podobne do poniższych. Należy pamiętać, że kody skrótów dla ciągu są identyczne w dwóch domenach aplikacji.

String 'This is a string.' in domain 'PerDomain.exe': 941BCEAC  
String 'This is a string.' in domain 'NewDomain': 941BCEAC  

Jeśli jednak dodasz następujący plik konfiguracji do katalogu przykładu, a następnie uruchomisz przykład, kody skrótów dla tego samego ciągu będą się różnić w zależności od domeny aplikacji.

<?xml version ="1.0"?>  
<configuration>  
   <runtime>  
      <UseRandomizedStringHashAlgorithm enabled="1" />  
   </runtime>  
</configuration>  

Gdy plik konfiguracji jest obecny, w przykładzie są wyświetlane następujące dane wyjściowe:

String 'This is a string.' in domain 'PerDomain.exe': 5435776D  
String 'This is a string.' in domain 'NewDomain': 75CC8236  

Zobacz też