공용 언어 런타임이 애플리케이션 도메인별로 문자열에 대한 해시 코드를 계산하는지 여부를 결정합니다.
<구성>
<런타임>
<UseRandomizedStringHashAlgorithm>
문법
<UseRandomizedStringHashAlgorithm
enabled=0|1 />
특성 및 요소
다음의 섹션은 특성, 자식 요소 및 부모 요소에 대해 설명합니다.
Attributes
| 특성 | Description |
|---|---|
enabled |
필수 특성입니다. 문자열에 대한 해시 코드가 애플리케이션 도메인별로 계산되는지 여부를 지정합니다. |
enabled 특성
| 가치 | Description |
|---|---|
0 |
공용 언어 런타임은 애플리케이션 도메인별로 문자열에 대한 해시 코드를 계산하지 않습니다. 단일 알고리즘은 문자열 해시 코드를 계산하는 데 사용됩니다. 기본값입니다. |
1 |
공용 언어 런타임은 애플리케이션 도메인별로 문자열에 대한 해시 코드를 계산합니다. 서로 다른 애플리케이션 도메인 및 다른 프로세스의 동일한 문자열에는 다른 해시 코드가 있습니다. |
자식 요소
없음.
부모 요소
| 요소 | Description |
|---|---|
configuration |
공용 언어 런타임 및 .NET Framework 애플리케이션에서 사용하는 모든 구성 파일의 루트 요소입니다. |
runtime |
런타임 초기화 옵션에 대한 정보를 포함합니다. |
비고
기본적으로 StringComparer 클래스와 메서드는 String.GetHashCode 애플리케이션 도메인 간에 일관된 해시 코드를 생성하는 단일 해시 알고리즘을 사용합니다. 이는 요소의 enabled<UseRandomizedStringHashAlgorithm> 특성을 .로 설정하는 것과 0같습니다. .NET Framework 4에서 사용되는 해시 알고리즘입니다.
클래스와 String.GetHashCode 메서드는 StringComparer 애플리케이션 도메인별로 해시 코드를 계산하는 다른 해시 알고리즘을 사용할 수도 있습니다. 따라서 해당 문자열에 대한 해시 코드는 애플리케이션 도메인 간에 다릅니다. 이는 옵트인 기능입니다. 이를 활용하려면 요소1의 <UseRandomizedStringHashAlgorithm> 특성을 .로 설정 enabled 해야 합니다.
해시 테이블의 문자열 조회는 일반적으로 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 '{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
참고하십시오
.NET