RuntimeHelpers.GetHashCode(Object) 메서드

정의

특정 개체에 대한 해시 함수로 사용되며 해시 테이블과 같은 해시 코드를 사용하는 데이터 구조 및 알고리즘에 적합합니다.Serves as a hash function for a particular object, and is suitable for use in algorithms and data structures that use hash codes, such as a hash table.

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

매개 변수

o
Object

해시 코드를 검색할 개체입니다.An object to retrieve the hash code for.

반환

o 매개 변수로 식별되는 개체의 해시 코드입니다.A hash code for the object identified by the o parameter.

예제

다음 예제에서는 간의 차이 Object.GetHashCodeRuntimeHelpers.GetHashCode 메서드.The following example demonstrates the difference between the Object.GetHashCode and RuntimeHelpers.GetHashCode methods. 다음 예제의 출력이 보여 줍니다.The output from the example illustrates the following:

  • 에 전달 된 문자열의 첫 번째 집합에 대 한 해시 코드의 두 집합의 ShowHashCodes 메서드는 문자열을 완전히 다르기 때문에 다릅니다.Both sets of hash codes for the first set of strings passed to the ShowHashCodes method are different, because the strings are completely different.

  • Object.GetHashCode 에 전달 된 문자열의 두 번째 집합에 대해 동일한 해시 코드를 생성 하는 ShowHashCodes 메서드를 문자열 때문입니다.Object.GetHashCode generates the same hash code for the second set of strings passed to the ShowHashCodes method, because the strings are equal. 그러나는 RuntimeHelpers.GetHashCode 메서드가 없습니다.However, the RuntimeHelpers.GetHashCode method does not. 첫 번째 문자열 리터럴 문자열을 사용 하 여 정의 되 고 따라서 인턴 지정 됩니다.The first string is defined by using a string literal and so is interned. 두 번째 문자열의 값이 동일한 경우에 해당 인턴 지정 되지를 호출 하 여 반환 되기 때문에 String.Format 메서드.Although the value of the second string is the same, it is not interned, because it is returned by a call to the String.Format method.

  • 생성 된 해시 코드를 세 번째 문자열의 경우 Object.GetHashCode 에서 생성 된 해시 코드는 마찬가지로 두 문자열이 동일한 경우에 대 한 RuntimeHelpers.GetHashCode합니다.In the case of the third string, the hash codes produced by Object.GetHashCode for both strings are identical, as are the hash codes produced by RuntimeHelpers.GetHashCode. 이 컴파일러에 단일 문자열 리터럴로, 두 문자열에 할당 된 값을 처리 하기 때문에 동일한 인턴 지정된 문자열에 문자열 변수를 참조 하세요.This is because the compiler has treated the value assigned to both strings as a single string literal, and so the string variables refer to the same interned string.

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 메서드.The RuntimeHelpers.GetHashCode method always calls the Object.GetHashCode method non-virtually, even if the object's type has overridden the Object.GetHashCode method. 따라서 사용 하 여 RuntimeHelpers.GetHashCode 호출에서 다를 수 있습니다 GetHashCode 사용 하 여 개체에 직접는 Object.GetHashCode 메서드.Therefore, using RuntimeHelpers.GetHashCode might differ from calling GetHashCode directly on the object with the Object.GetHashCode method.

경고

하지만 RuntimeHelpers.GetHashCode 동일 개체 참조에 대 한 동일한 해시 코드를 반환 하는 메서드, 하지 사용 해야이 메서드 개체 id를 테스트 하려면 때문이 해시 코드를 개체 참조를 고유 하 게 식별 하지 않습니다.Although the RuntimeHelpers.GetHashCode method returns identical hash codes for identical object references, you should not use this method to test for object identity, because this hash code does not uniquely identify an object reference. 개체 식별에 대 한 테스트 (즉, 두 개의 테스트 개체를 메모리에서 같은 개체 참조)를 호출 합니다 Object.ReferenceEquals 메서드.To test for object identify (that is, to test that two objects reference the same object in memory), call the Object.ReferenceEquals method. 사용 해야 하거나 GetHashCode 문자열 내부 풀에 추가 하기 때문에 두 개의 문자열 같은 개체 참조를 나타내는 여부를 테스트 하려면.Nor should you use GetHashCode to test whether two strings represent equal object references, because the string is interned. 문자열 인터닝에 대 한 테스트를 호출 합니다 String.IsInterned 메서드.To test for string interning, call the String.IsInterned method.

합니다 Object.GetHashCodeRuntimeHelpers.GetHashCode 메서드 차이점은 다음과 같습니다.The Object.GetHashCode and RuntimeHelpers.GetHashCode methods differ as follows:

  • Object.GetHashCode 개체의 같음 정의 기반으로 하는 해시 코드를 반환 합니다.Object.GetHashCode returns a hash code that is based on the object's definition of equality. 예를 들어, 동일한 콘텐츠로 두 문자열 값이 동일한 돌아갑니다 Object.GetHashCode합니다.For example, two strings with identical contents will return the same value for Object.GetHashCode.

  • RuntimeHelpers.GetHashCode 개체 id를 나타내는 해시 코드를 반환 합니다.RuntimeHelpers.GetHashCode returns a hash code that indicates object identity. 즉, 두 개의 string 변수 내용이 동일 하 고는 내부 풀에 추가 하는 문자열을 나타냅니다 (참조를 문자열 인터닝 섹션) 또는 메모리에 단일 문자열로 반환 동일한 나타내는 해시 코드입니다.That is, two string variables whose contents are identical and that represent a string that is interned (see the String Interning section) or that represent a single string in memory return identical hash codes.

중요

GetHashCode 항상 같은 개체 참조에 대 한 동일한 해시 코드를 반환 합니다.Note that GetHashCode always returns identical hash codes for equal object references. 그러나는 성립 되지: 같은 해시 코드는 같은 개체 참조를 나타내지 않습니다.However, the reverse is not true: equal hash codes do not indicate equal object references. 특정 해시 코드 값을 특정 개체 참조; 고유 하지 않습니다. 다른 개체 참조는 동일한 해시 코드를 생성할 수 있습니다.A particular hash code value is not unique to a particular object reference; different object references can generate identical hash codes.

이 메서드는 컴파일러에서 사용 됩니다.This method is used by compilers.

문자열 인터닝String Interning

CLR (공용 언어 런타임) 문자열의 내부 풀 유지 관리 및 리터럴 풀에 저장 합니다.The common language runtime (CLR) maintains an internal pool of strings and stores literals in the pool. 두 개의 문자열이 (예를 들어 str1 하 고 str2)는 동일한 문자열 리터럴, CLR은 설정에서 형성 된 str1str2 메모리를 절약 하는 관리 되는 힙에 동일한 위치를 가리키도록 합니다.If two strings (for example, str1 and str2) are formed from an identical string literal, the CLR will set str1 and str2 to point to the same location on the managed heap to conserve memory. 호출 RuntimeHelpers.GetHashCode 이 두 문자열에서 개체에는 이전 섹션에서 두 번째 글머리 기호 항목 달리 동일한 해시 코드를 생성 됩니다.Calling RuntimeHelpers.GetHashCode on these two string objects will produce the same hash code, contrary to the second bulleted item in the previous section.

CLR는 리터럴만 풀에 추가합니다.The CLR adds only literals to the pool. 같은 연결 문자열 작업의 결과 컴파일러는 단일 문자열 리터럴로 문자열 연결을 확인 하지 않는 한 풀에 추가 되지 않습니다.Results of string operations such as concatenation are not added to the pool, unless the compiler resolves the string concatenation as a single string literal. 따라서 경우 str2 연결 작업의 결과로 만들어진 및 str2 동일 str1를 사용 하 여 RuntimeHelpers.GetHashCode 개체 이러한 두 개의 문자열에는 같은 해시 코드를 생성 하지 것입니다.Therefore, if str2 was created as the result of a concatenation operation, and str2 is identical to str1, using RuntimeHelpers.GetHashCode on these two string objects will not produce the same hash code.

풀에 연결 된 문자열을 명시적으로 추가 하려는 경우 사용 된 String.Intern 메서드.If you want to add a concatenated string to the pool explicitly, use the String.Intern method.

사용할 수도 있습니다는 String.IsInterned 문자열로 참조를 풀된에 있는지 여부를 확인 하는 메서드.You can also use the String.IsInterned method to check whether a string has an interned reference.

적용 대상

추가 정보