Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Определяет, вычисляет ли среда CLR хэш-коды для строк на основе домена приложения.
<configuration>
<runtime>
<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 для элемента <UseRandomizedStringHashAlgorithm>атрибут1.
Поиск строк в хэш-таблице обычно является операцией 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