RuntimeHelpers.GetHashCode(Object) 메서드

정의

특정 개체에 대한 해시 함수로 사용되며 해시 테이블과 같은 해시 코드를 사용하는 데이터 구조 및 알고리즘에 적합합니다.

public:
 static int GetHashCode(System::Object ^ o);
public static int GetHashCode (object o);
public static int GetHashCode (object? o);
static member GetHashCode : obj -> int
Public Shared Function GetHashCode (o As Object) As Integer

매개 변수

o
Object

해시 코드를 검색할 개체입니다.

반환

Int32

o 매개 변수로 식별되는 개체의 해시 코드입니다.

예제

다음 예제에서는 및 메서드 간의 차이점을 보여 줍니다 Object.GetHashCode RuntimeHelpers.GetHashCode . 예제의 출력은 다음을 보여 줍니다.

  • 메서드에 전달 된 첫 번째 문자열 집합에 대 한 해시 코드의 두 집합은 ShowHashCodes 문자열이 완전히 다르기 때문에 서로 다릅니다.

  • Object.GetHashCode 는 두 번째 문자열 ShowHashCodes 은 동일 하므로 메서드에 전달 된 두 번째 문자열 집합에 대해 동일한 해시 코드를 생성 합니다. 그러나이 RuntimeHelpers.GetHashCode 메서드는 그렇지 않습니다. 첫 번째 문자열은 문자열 리터럴을 사용 하 여 정의 되므로는 인턴 지정 됩니다. 두 번째 문자열의 값은 동일 하지만 메서드를 호출 하 여 반환 되기 때문에 풀에 속하지 않습니다 String.Format .

  • 세 번째 문자열의 경우에 의해 생성 된 해시 코드는에 Object.GetHashCode 의해 생성 된 해시 코드와 마찬가지로 두 문자열에 대해에 의해 생성 된 해시 코드와 동일 합니다 RuntimeHelpers.GetHashCode . 이는 컴파일러가 두 문자열에 할당 된 값을 단일 문자열 리터럴로 처리 하므로 문자열 변수가 동일한 인턴 문자열을 참조 하기 때문입니다.

using System;
using System.Runtime.CompilerServices;

public class Example
{
   public static void Main()
   {
      Console.WriteLine("{0,-18} {1,6} {2,18:N0}    {3,6} {4,18:N0}\n",
                        "", "Var 1", "Hash Code", "Var 2", "Hash Code");
      
      // Get hash codes of two different strings.
      String sc1 = "String #1";
      String sc2 = "String #2";
      ShowHashCodes("sc1", sc1, "sc2", sc2);
 
      // Get hash codes of two identical non-interned strings.
      String s1 = "This string";
      String s2 = String.Format("{0} {1}", "This", "string");
      ShowHashCodes("s1", s1, "s2", s2);

      // Get hash codes of two (evidently concatenated) strings.
      String si1 = "This is a string!";
      String si2 = "This " + "is " + "a " + "string!";
      ShowHashCodes("si1", si1, "si2", si2);
   }

   private static void ShowHashCodes(String var1, Object value1, 
                                     String var2, Object value2)
   {
      Console.WriteLine("{0,-18} {1,6} {2,18:X8}    {3,6} {4,18:X8}",
                        "Obj.GetHashCode", var1, value1.GetHashCode(),
                        var2, value2.GetHashCode());

      Console.WriteLine("{0,-18} {1,6} {2,18:X8}    {3,6} {4,18:X8}\n",
                        "RTH.GetHashCode", var1, RuntimeHelpers.GetHashCode(value1),
                        var2, RuntimeHelpers.GetHashCode(value2));
   }
}
// The example displays output similar to the following:
//                        Var 1          Hash Code     Var 2          Hash Code
//    
//    Obj.GetHashCode       sc1           94EABD27       sc2           94EABD24
//    RTH.GetHashCode       sc1           02BF8098       sc2           00BB8560
//    
//    Obj.GetHashCode        s1           29C5A397        s2           29C5A397
//    RTH.GetHashCode        s1           0297B065        s2           03553390
//    
//    Obj.GetHashCode       si1           941BCEA5       si2           941BCEA5
//    RTH.GetHashCode       si1           01FED012       si2           01FED012
Imports System.Runtime.CompilerServices

Module Example
   Public Sub Main()
      Console.WriteLine("{0,-18} {1,6} {2,18:N0}    {3,6} {4,18:N0}",
                        "", "Var 1", "Hash Code", "Var 2", "Hash Code")
      Console.WriteLine()
      
      ' Get hash codes of two different strings.
      Dim sc1 As String = "String #1"
      Dim sc2 As String = "String #2"
      ShowHashCodes("sc1", sc1, "sc2", sc2)
 
      ' Get hash codes of two identical non-interned strings.
      Dim s1 As String = "This string"
      Dim s2 As String = String.Format("{0} {1}", "This", "string")
      ShowHashCodes("s1", s1, "s2", s2)

      ' Get hash codes of two (evidently concatenated) strings.
      Dim si1 As String = "This is a string!"
      Dim si2 As String = "This " + "is " + "a " + "string!"
      ShowHashCodes("si1", si1, "si2", si2)
   End Sub
   
   Private Sub ShowHashCodes(var1 As String, value1 As Object, 
                             var2 As String, value2 As Object)
      Console.WriteLine("{0,-18} {1,6} {2,18:X8}    {3,6} {4,18:X8}",
                        "Obj.GetHashCode", var1, value1.GetHashCode,
                        var2, value2.GetHashCode)

      Console.WriteLine("{0,-18} {1,6} {2,18:X8}    {3,6} {4,18:X8}",
                        "RTH.GetHashCode", var1, RuntimeHelpers.GetHashCode(value1),
                        var2, RuntimeHelpers.GetHashCode(value2))
      Console.WriteLine()
   End Sub
End Module
' The example displays output similar to the following:
'                        Var 1          Hash Code     Var 2          Hash Code
'    
'    Obj.GetHashCode       sc1           94EABD27       sc2           94EABD24
'    RTH.GetHashCode       sc1           02BF8098       sc2           00BB8560
'    
'    Obj.GetHashCode        s1           29C5A397        s2           29C5A397
'    RTH.GetHashCode        s1           0297B065        s2           03553390
'    
'    Obj.GetHashCode       si1           941BCEA5       si2           941BCEA5
'    RTH.GetHashCode       si1           01FED012       si2           01FED012

설명

메서드는 RuntimeHelpers.GetHashCode Object.GetHashCode 개체의 형식이 메서드를 재정의 한 경우에도 항상 메서드를 비가상으로 호출 합니다 Object.GetHashCode . 따라서를 사용 하면 메서드를 사용 하 여 RuntimeHelpers.GetHashCode 개체에서 직접 호출 하는 것과 다를 수 있습니다 GetHashCode Object.GetHashCode .

경고

메서드는 RuntimeHelpers.GetHashCode 동일한 개체 참조에 대해 동일한 해시 코드를 반환 하지만,이 해시 코드는 개체 참조를 고유 하 게 식별 하지 않으므로이 메서드를 사용 하 여 개체 id를 테스트 하면 안 됩니다. 개체 식별을 테스트 하려면 (즉, 두 개체가 메모리에서 같은 개체를 참조 하는지 테스트 하려면) 메서드를 호출 Object.ReferenceEquals 합니다. 및는 두 문자열이 GetHashCode 동일한 개체 참조를 나타내는지 여부를 테스트 하는 데를 사용 해야 합니다. 문자열 인턴을 테스트 하려면 메서드를 호출 String.IsInterned 합니다.

및 메서드는 다음과 같습니다 Object.GetHashCode RuntimeHelpers.GetHashCode .

  • Object.GetHashCode 개체의 같음 정의를 기반으로 하는 해시 코드를 반환 합니다. 예를 들어 내용이 동일한 두 문자열은에 대해 동일한 값을 반환 Object.GetHashCode 합니다.

  • RuntimeHelpers.GetHashCode 개체 id를 나타내는 해시 코드를 반환 합니다. 즉, 내용이 동일 하 고 인턴 ( 문자열 인턴 섹션 참조) 또는 단일 문자열을 나타내는 문자열을 나타내는 두 개의 문자열 변수가 동일한 해시 코드를 반환 합니다.

중요

는 동일한 GetHashCode 개체 참조에 대해 항상 동일한 해시 코드를 반환 합니다. 그러나 반대의 경우도 마찬가지입니다. 동일한 해시 코드는 동일한 개체 참조를 나타내지 않습니다. 특정 해시 코드 값은 특정 개체 참조에 대해 고유 하지 않습니다. 서로 다른 개체 참조는 동일한 해시 코드를 생성할 수 있습니다.

이 메서드는 컴파일러에서 사용 됩니다.

문자열 인턴

CLR (공용 언어 런타임)은 문자열의 내부 풀을 유지 관리 하 고 리터럴을 풀에 저장 합니다. 두 문자열 (예: str1str2 )이 동일한 문자열 리터럴에서 형성 되는 경우 CLR은 str1 메모리를 str2 절약 하기 위해 관리 되는 힙에서 동일한 위치를 가리키도록 및를 설정 합니다. RuntimeHelpers.GetHashCode이러한 두 문자열 개체에 대해를 호출 하면 이전 섹션의 두 번째 글머리 기호 항목과 달리 동일한 해시 코드가 생성 됩니다.

CLR은 풀에 리터럴을 추가 합니다. 컴파일러가 문자열 연결을 단일 문자열 리터럴로 확인 하지 않는 한, 연결과 같은 문자열 작업의 결과는 풀에 추가 되지 않습니다. 따라서 str2 가 연결 작업의 결과로 만들어지고와 str2 동일한 경우 str1 RuntimeHelpers.GetHashCode 이 두 문자열 개체를 사용 하면 동일한 해시 코드가 생성 되지 않습니다.

연결 된 문자열을 풀에 명시적으로 추가 하려면 메서드를 사용 String.Intern 합니다.

또한 메서드를 사용 하 여 String.IsInterned 문자열에 인턴 지정 참조가 있는지 여부를 확인할 수 있습니다.

적용 대상

추가 정보