System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode 메서드
이 문서에서는 이 API에 대한 참조 설명서에 대한 추가 설명서를 제공합니다.
RuntimeHelpers.GetHashCode 개체의 형식이 메서드를 Object.GetHashCode 재정의한 경우에도 메서드는 항상 가상이 아닌 메서드를 Object.GetHashCode 호출합니다. 따라서 사용은 메서드를 사용하여 RuntimeHelpers.GetHashCode 개체 Object.GetHashCode 에서 직접 호출 GetHashCode
하는 것과 다를 수 있습니다.
Warning
메서드는 RuntimeHelpers.GetHashCode 동일한 개체 참조에 대해 동일한 해시 코드를 반환하지만 이 해시 코드는 개체 참조를 고유하게 식별하지 않으므로 이 메서드를 사용하여 개체 ID를 테스트하면 안 됩니다. 개체 ID를 테스트하려면(즉, 두 개체가 메모리에서 동일한 개체를 참조하는지 테스트하려면) 메서드를 호출합니다 Object.ReferenceEquals . 문자열이 인턴되어 있기 때문에 두 문자열이 동일한 개체 참조를 나타내는지 여부를 테스트하는 데도 사용하지 GetHashCode 않아야 합니다. 문자열 인턴링을 테스트하려면 메서드를 호출합니다 String.IsInterned .
메서드와 RuntimeHelpers.GetHashCode 메서드는 Object.GetHashCode 다음과 같이 다릅니다.
- Object.GetHashCode 는 개체의 같음 정의를 기반으로 하는 해시 코드를 반환합니다. 예를 들어 내용이 동일한 두 문자열은 동일한 값을 Object.GetHashCode반환합니다.
- RuntimeHelpers.GetHashCode 는 개체 ID를 나타내는 해시 코드를 반환합니다. 즉, 내용이 동일하고 인턴된 문자열(문자열 인턴링 섹션 참조 ) 또는 메모리의 단일 문자열을 나타내는 문자열을 나타내는 두 문자열 변수는 동일한 해시 코드를 반환합니다.
Important
GetHashCode 항상 동일한 개체 참조에 대해 동일한 해시 코드를 반환합니다. 그러나 반대의 경우는 true가 아닙니다. 동일한 해시 코드는 동일한 개체 참조를 나타내지 않습니다. 특정 해시 코드 값은 특정 개체 참조에 고유하지 않습니다. 다른 개체 참조는 동일한 해시 코드를 생성할 수 있습니다.
이 메서드는 컴파일러에서 사용됩니다.
문자열 인턴링
CLR(공용 언어 런타임)은 내부 문자열 풀을 기본 풀에 리터럴을 저장합니다. 두 문자열(예: str1
및 str2
)이 동일한 문자열 리터럴에서 형성되는 경우 CLR은 메모리를 절약하기 위해 관리되는 힙의 동일한 위치를 설정하고 str1
str2
가리킵니다. 이러한 두 문자열 개체를 호출 RuntimeHelpers.GetHashCode 하면 이전 섹션의 두 번째 글머리 기호 항목과 달리 동일한 해시 코드가 생성됩니다.
CLR은 풀에 리터럴만 추가합니다. 컴파일러가 문자열 연결을 단일 문자열 리터럴로 해결하지 않는 한 연결과 같은 문자열 작업의 결과는 풀에 추가되지 않습니다. 따라서 연결 작업의 결과로 만들어지고 str2
동일한 str1
경우 str2
이러한 두 문자열 개체를 사용하면 RuntimeHelpers.GetHashCode 동일한 해시 코드가 생성되지 않습니다.
연결된 문자열을 풀에 명시적으로 추가하려면 메서드를 String.Intern 사용합니다.
이 메서드를 사용하여 문자열에 String.IsInterned 인턴 참조가 있는지 여부를 검사 수도 있습니다.
예제
다음 예제에서는 메서드와 메서드의 차이점을 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
.NET