<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, s
któ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