RuntimeHelpers.GetHashCode(Object) RuntimeHelpers.GetHashCode(Object) RuntimeHelpers.GetHashCode(Object) RuntimeHelpers.GetHashCode(Object) Method

定義

特定のオブジェクトのハッシュ関数として機能し、ハッシュ アルゴリズムやハッシュ テーブルのようなハッシュ コードを使うデータ構造での使用に適しています。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 Object Object 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 渡される文字列の 2 番目のセットを同じハッシュ コードを生成、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. 2 番目の文字列の値が同じですが、されません隔離されているへの呼び出しによって返されるため、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.

  • 3 番目の文字列の場合は、によって生成されたハッシュ コード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. これは、コンパイラが 1 つの文字列リテラルには、両方の文字列に割り当てられた値を扱われるため、そのため、隔離されたと同じ文字列を文字列変数が参照してください。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. テストするには、オブジェクトを識別する (つまり、その 2 つのテスト オブジェクトにメモリ内で同じオブジェクトを参照)、呼び出し、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文字列がインターン プールに存在するために、2 つの文字列が等しいオブジェクトの参照を表すかどうかをテストします。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. たとえば、同じコンテンツを持つ 2 つの文字列がの同じ値を返す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. つまり、2 つの文字列変数の内容は同じですがインターン プールに存在する文字列を表す (を参照してください、文字列インターンセクション) またはメモリ内の 1 つの文字列を返すと同じを表すハッシュ コード。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. ただし、その逆は true。 等しいオブジェクト参照は等しいハッシュ コードを示していません。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. 2 つの文字列の場合 (たとえば、str1str2)、まったく同じ文字列リテラルでは、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これら 2 つの文字列にオブジェクトが前のセクションで 2 番目の箇条書き項目とは異なり、同じハッシュ コードを生成します。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これら 2 つの文字列のオブジェクトは、同じハッシュ コードを生成しません。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.

適用対象

こちらもご覧ください