Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Определяет, вычисляет ли среда CLR хэш-коды для строк на основе домена приложения.
<конфигурация>
<среда выполнения>
<UseRandomizedStringHashAlgorithm>
Синтаксис
<UseRandomizedStringHashAlgorithm
enabled=0|1 />
Атрибуты и элементы
В следующих разделах описаны атрибуты, дочерние и родительские элементы.
Attributes
| Свойство | Description |
|---|---|
enabled |
Обязательный атрибут. Указывает, вычисляются ли хэш-коды строк на основе домена приложения. |
Атрибут с поддержкой
| Ценность | Description |
|---|---|
0 |
Среда CLR не вычисляет хэш-коды строк на основе домена приложения; для вычисления хэш-кодов строк используется один алгоритм. Это значение по умолчанию. |
1 |
Среда CLR вычисляет хэш-коды строк на основе домена приложения. Идентичные строки в разных доменах приложений и в разных процессах будут иметь разные хэш-коды. |
Дочерние элементы
Нет.
Родительские элементы
| Элемент | Description |
|---|---|
configuration |
Корневой элемент в любом файле конфигурации, используемом средой CLR и приложениями .NET Framework. |
runtime |
Содержит сведения о параметрах инициализации среды выполнения. |
Замечания
По умолчанию StringComparer класс и String.GetHashCode метод используют один хэш-алгоритм, который создает согласованный хэш-код в доменах приложений. Это эквивалентно настройке enabled атрибута <UseRandomizedStringHashAlgorithm> элемента 0. Это алгоритм хэширования, используемый в .NET Framework 4.
Класс StringComparer и String.GetHashCode метод также могут использовать другой алгоритм хэширования, который вычисляет хэш-коды на основе домена приложения. В результате хэш-коды эквивалентных строк будут отличаться в разных доменах приложений. Это функция согласия; чтобы воспользоваться преимуществами, необходимо задать enabled для элемента 1атрибут<UseRandomizedStringHashAlgorithm>.
Поиск строк в хэш-таблице обычно является операцией 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