String.GetHashCode 메서드

정의

오버로드

GetHashCode(ReadOnlySpan<Char>, StringComparison)

지정된 규칙을 사용하여 제공된 읽기 전용 문자 범위의 해시 코드를 반환합니다.

GetHashCode(StringComparison)

지정된 규칙을 사용하여 이 문자열의 해시 코드를 반환합니다.

GetHashCode(ReadOnlySpan<Char>)

제공된 읽기 전용 문자 범위의 해시 코드를 반환합니다.

GetHashCode()

해당 문자열에 대한 해시 코드를 반환합니다.

GetHashCode(ReadOnlySpan<Char>, StringComparison)

지정된 규칙을 사용하여 제공된 읽기 전용 문자 범위의 해시 코드를 반환합니다.

public:
 static int GetHashCode(ReadOnlySpan<char> value, StringComparison comparisonType);
public static int GetHashCode (ReadOnlySpan<char> value, StringComparison comparisonType);
static member GetHashCode : ReadOnlySpan<char> * StringComparison -> int
Public Shared Function GetHashCode (value As ReadOnlySpan(Of Char), comparisonType As StringComparison) As Integer

매개 변수

value
ReadOnlySpan<Char>

읽기 전용 문자 범위입니다.

comparisonType
StringComparison

비교에 사용할 규칙을 지정하는 열거형 값 중 하나입니다.

반환

Int32

부호 있는 32비트 정수 해시 코드입니다.

적용 대상

GetHashCode(StringComparison)

지정된 규칙을 사용하여 이 문자열의 해시 코드를 반환합니다.

public:
 int GetHashCode(StringComparison comparisonType);
public int GetHashCode (StringComparison comparisonType);
override this.GetHashCode : StringComparison -> int
Public Function GetHashCode (comparisonType As StringComparison) As Integer

매개 변수

comparisonType
StringComparison

비교에 사용할 규칙을 지정하는 열거형 값 중 하나입니다.

반환

Int32

부호 있는 32비트 정수 해시 코드입니다.

적용 대상

GetHashCode(ReadOnlySpan<Char>)

제공된 읽기 전용 문자 범위의 해시 코드를 반환합니다.

public:
 static int GetHashCode(ReadOnlySpan<char> value);
public static int GetHashCode (ReadOnlySpan<char> value);
static member GetHashCode : ReadOnlySpan<char> -> int
Public Shared Function GetHashCode (value As ReadOnlySpan(Of Char)) As Integer

매개 변수

value
ReadOnlySpan<Char>

읽기 전용 문자 범위입니다.

반환

Int32

부호 있는 32비트 정수 해시 코드입니다.

적용 대상

GetHashCode()

해당 문자열에 대한 해시 코드를 반환합니다.

public:
 override int GetHashCode();
public override int GetHashCode ();
override this.GetHashCode : unit -> int
Public Overrides Function GetHashCode () As Integer

반환

Int32

부호 있는 32비트 정수 해시 코드입니다.

예제

다음 예제에서는 GetHashCode 다양 한 입력 문자열을 사용 하는 메서드를 보여 줍니다.

using namespace System;

void DisplayHashCode( String^ Operand )
{
   int HashCode = Operand->GetHashCode();
   Console::WriteLine( "The hash code for \"{0}\" is: 0x{1:X8}, {1}", Operand, HashCode );
}

int main()
{
   DisplayHashCode( "" );
   DisplayHashCode( "a" );
   DisplayHashCode( "ab" );
   DisplayHashCode( "abc" );
   DisplayHashCode( "abd" );
   DisplayHashCode( "abe" );
   DisplayHashCode( "abcdef" );
   DisplayHashCode( "abcdeg" );
   DisplayHashCode( "abcdeh" );
   DisplayHashCode( "abcdei" );
   DisplayHashCode( "Abcdeg" );
   DisplayHashCode( "Abcdeh" );
   DisplayHashCode( "Abcdei" );
}

/*
This example displays output like the following:
      The hash code for "" is: 0x2D2816FE, 757602046
      The hash code for "a" is: 0xCDCAB7BF, -842352705
      The hash code for "ab" is: 0xCDE8B7BF, -840386625
      The hash code for "abc" is: 0x2001D81A, 536991770
      The hash code for "abd" is: 0xC2A94CB5, -1029092171
      The hash code for "abe" is: 0x6550C150, 1699791184
      The hash code for "abcdef" is: 0x1762906D, 392335469
      The hash code for "abcdeg" is: 0x1763906D, 392401005
      The hash code for "abcdeh" is: 0x175C906D, 391942253
      The hash code for "abcdei" is: 0x175D906D, 392007789
      The hash code for "Abcdeg" is: 0x1763954D, 392402253
      The hash code for "Abcdeh" is: 0x175C954D, 391943501
      The hash code for "Abcdei" is: 0x175D954D, 392009037
*/
using System;

class GetHashCode 
{
    public static void Main() 
    {
        DisplayHashCode( "" );
        DisplayHashCode( "a" );
        DisplayHashCode( "ab" );
        DisplayHashCode( "abc" );
        DisplayHashCode( "abd" );
        DisplayHashCode( "abe" );
        DisplayHashCode( "abcdef" );
        DisplayHashCode( "abcdeg" );
        DisplayHashCode( "abcdeh" );
        DisplayHashCode( "abcdei" );
        DisplayHashCode( "Abcdeg" );
        DisplayHashCode( "Abcdeh" );
        DisplayHashCode( "Abcdei" );
    }

    static void DisplayHashCode( String Operand )
    {
        int     HashCode = Operand.GetHashCode( );
        Console.WriteLine("The hash code for \"{0}\" is: 0x{1:X8}, {1}",
                          Operand, HashCode );
    }
}
/*
      This example displays output like the following:
      The hash code for "" is: 0x2D2816FE, 757602046
      The hash code for "a" is: 0xCDCAB7BF, -842352705
      The hash code for "ab" is: 0xCDE8B7BF, -840386625
      The hash code for "abc" is: 0x2001D81A, 536991770
      The hash code for "abd" is: 0xC2A94CB5, -1029092171
      The hash code for "abe" is: 0x6550C150, 1699791184
      The hash code for "abcdef" is: 0x1762906D, 392335469
      The hash code for "abcdeg" is: 0x1763906D, 392401005
      The hash code for "abcdeh" is: 0x175C906D, 391942253
      The hash code for "abcdei" is: 0x175D906D, 392007789
      The hash code for "Abcdeg" is: 0x1763954D, 392402253
      The hash code for "Abcdeh" is: 0x175C954D, 391943501
      The hash code for "Abcdei" is: 0x175D954D, 392009037
*/
Module GetHashCode
    Sub Main()
        DisplayHashCode("")
        DisplayHashCode("a")
        DisplayHashCode("ab")
        DisplayHashCode("abc")
        DisplayHashCode("abd")
        DisplayHashCode("abe")
        DisplayHashCode("abcdef")
        DisplayHashCode("abcdeg")
        DisplayHashCode("abcdeh")
        DisplayHashCode("abcdei")
        DisplayHashCode("Abcdeg")
        DisplayHashCode("Abcdeh")
        DisplayHashCode("Abcdei")
    End Sub
       
    Sub DisplayHashCode(Operand As String)
        Dim HashCode As Integer = Operand.GetHashCode()
        Console.WriteLine("The hash code for ""{0}"" is: 0x{1:X8}, {1}", 
                          Operand, HashCode)
    End Sub 
End Module 
' This example displays output like the following:
'       The hash code for "" is: 0x2D2816FE, 757602046
'       The hash code for "a" is: 0xCDCAB7BF, -842352705
'       The hash code for "ab" is: 0xCDE8B7BF, -840386625
'       The hash code for "abc" is: 0x2001D81A, 536991770
'       The hash code for "abd" is: 0xC2A94CB5, -1029092171
'       The hash code for "abe" is: 0x6550C150, 1699791184
'       The hash code for "abcdef" is: 0x1762906D, 392335469
'       The hash code for "abcdeg" is: 0x1763906D, 392401005
'       The hash code for "abcdeh" is: 0x175C906D, 391942253
'       The hash code for "abcdei" is: 0x175D906D, 392007789
'       The hash code for "Abcdeg" is: 0x1763954D, 392402253
'       The hash code for "Abcdeh" is: 0x175C954D, 391943501
'       The hash code for "Abcdei" is: 0x175D954D, 392009037

설명

의 동작은 GetHashCode 해당 구현에 따라 달라 지 며, 공용 언어 런타임의 한 버전에서 다른 버전으로 변경 될 수 있습니다. 이 문제가 발생 하는 이유는의 성능을 향상 시키기 위한 것입니다 GetHashCode .

중요

두 문자열 개체가 같으면 GetHashCode 메서드는 동일한 값을 반환 합니다. 그러나 각각의 고유한 문자열 값에 대 한 고유한 해시 코드 값은 없습니다. 서로 다른 문자열이 동일한 해시 코드를 반환할 수 있습니다.

해시 코드 자체는 안정적이 지 않을 수 있습니다. 단일 버전의 .NET에 대 한 .net 구현, .net 버전 전체 및 .NET 플랫폼 (예: 32 비트 및 64 비트) 간에 동일한 문자열의 해시 코드는 다를 수 있습니다. 일부 경우에도 애플리케이션 도메인 별로 다릅니다 수 있습니다. 즉, 동일한 프로그램의 두 후속 실행은 다른 해시 코드를 반환할 수 있습니다.

결과적으로 코드 생성 된 애플리케이션 도메인 외부에서 사용 되지 않아야 하는 해시 컬렉션의 키 필드를 사용 하지 않아야 및 유지 되지 해야 합니다.

마지막으로, 암호화 된 강력한 해시가 필요한 경우 암호화 해시 함수에서 반환 하는 값 대신 해시 코드를 사용 하지 마세요. 암호화 해시의 경우 또는 클래스에서 파생 된 클래스를 사용 System.Security.Cryptography.HashAlgorithm System.Security.Cryptography.KeyedHashAlgorithm 합니다.

해시 코드에 대 한 자세한 내용은을 참조 하십시오 Object.GetHashCode .

데스크톱 앱에서는 <UseRandomizedStringHashAlgorithm> 요소 를 사용 하 여 응용 프로그램 도메인 별로 고유한 해시 코드를 생성할 수 있습니다. 이렇게 하면 충돌 수를 줄이고 해시 테이블을 사용 하는 삽입 및 조회의 전반적인 성능을 향상 시킬 수 있습니다. 다음 예제에서는 <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 '{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

중요

해시 코드는 해시 테이블에서 키 개체를 효율적으로 삽입 하 고 검색 하는 데 사용 됩니다. 그러나 해시 코드는 문자열을 고유 하 게 식별 하지 않습니다. 동일한 문자열의 해시 코드는 동일 하지만 공용 언어 런타임에서는 동일한 해시 코드를 다른 문자열에 할당할 수도 있습니다. 또한, 해시 코드는.NET 버전, 단일 버전 내에서 플랫폼 및 애플리케이션 도메인 별로 달라질 수 있습니다. 이로 인해 해시 코드 값을 serialize 또는 유지 하거나 해시 테이블 또는 사전에서 키로 사용 하지 않아야 합니다.

해시 코드 및 메서드 사용에 대 한 자세한 내용은 GetHashCode 을 참조 하십시오 Object.GetHashCode .

호출자 참고

에서 반환 하는 값은 GetHashCode() 플랫폼에 따라 다릅니다. .NET Framework의 32 비트 및 64 비트 버전에서 차이가 있습니다. 또한 .NET Framework와 .net Core의 버전이 다를 수 있습니다.

추가 정보

적용 대상