<UseRandomizedStringHashAlgorithm> Element

공용 언어 런타임이 애플리케이션 도메인별로 문자열의 해시 코드를 계산할지를 결정합니다.

<configuration>
  <runtime>
    <UseRandomizedStringHashAlgorithm>

구문

<UseRandomizedStringHashAlgorithm
   enabled=0|1 />  

특성 및 요소

다음 섹션에서는 특성, 자식 요소 및 부모 요소에 대해 설명합니다.

특성

특성 설명
enabled 필수 특성입니다.

애플리케이션 도메인별로 문자열의 해시 코드를 계산할지를 지정합니다.

enabled 특성

Description
0 공용 언어 런타임은 애플리케이션 도메인별로 문자열에 대한 해시 코드를 계산하지 않습니다. 단일 알고리즘은 문자열 해시 코드를 계산하는 데 사용됩니다. 기본값입니다.
1 공용 언어 런타임은 애플리케이션 도메인별로 문자열에 대한 해시 코드를 계산합니다. 서로 다른 애플리케이션 도메인 및 다른 프로세스의 동일한 문자열에는 다른 해시 코드가 있습니다.

자식 요소

없음

부모 요소

요소 Description
configuration 공용 언어 런타임 및 .NET Framework 애플리케이션에서 사용하는 모든 구성 파일의 루트 요소입니다.
runtime 런타임 초기화 옵션에 대한 정보를 포함합니다.

설명

기본적으로 StringComparer 클래스 및 String.GetHashCode 메서드는 하나의 해시 알고리즘을 사용하여 애플리케이션 도메인 간에 일관된 해시 코드를 생성합니다. 이는 <UseRandomizedStringHashAlgorithm> 요소의 enabled 특성을 0으로 설정하는 것과 같습니다. .NET Framework 4에서 사용되는 해시 알고리즘입니다.

StringComparer 클래스 및 String.GetHashCode 메서드는 애플리케이션 도메인별로 해시 코드를 계산하는 다른 해시 알고리즘을 사용할 수도 있습니다. 따라서 해당 문자열에 대한 해시 코드는 애플리케이션 도메인 간에 다릅니다. 이는 옵트인 기능으로, 이를 활용하려면 <UseRandomizedStringHashAlgorithm> 요소의 enabled 특성을 1로 설정해야 합니다.

해시 테이블의 문자열 조회는 일반적으로 O(1) 작업입니다. 그러나 많은 수의 충돌이 발생하면 조회가 O(n2) 작업이 될 수 있습니다. <UseRandomizedStringHashAlgorithm> 구성의 요소를 사용하여 애플리케이션 도메인당 임의의 해시 알고리즘을 생성할 수 있으며, 이는 특히 해시 코드가 계산되는 키가 사용자의 데이터 입력을 기반으로 하는 경우 잠재적 충돌 수를 제한합니다.

예제

다음 예제에서는 프라이빗 문자열 상수 s가 포함된 DisplayString 클래스를 정의하며, 이 상수 값은 "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 '{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

구성 파일을 지정하지 않고 이 예제를 실행할 경우 다음과 유사한 출력이 표시됩니다. 문자열의 해시 코드는 두 애플리케이션 도메인에서 동일합니다.

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  

참고 항목