情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

String.GetHashCode メソッド

この文字列のハッシュ コードを返します。

名前空間:  System
アセンブリ:  mscorlib (mscorlib.dll 内)

public override int GetHashCode()

戻り値

型 : System.Int32
32 ビット符号付き整数ハッシュ コード。

GetHashCode の動作は実装に依存します。この実装は、共通言語ランタイムのあるバージョンから別のバージョンに変更される可能性があります。 GetHashCode のパフォーマンス向上がその理由です。

重要 : 重要

2 つの文字列オブジェクトが等しい場合、GetHashCode メソッドは同一の値を返します。 ただし、各一意の文字列値に対して一意のハッシュ コード値は存在しません。 異なる文字列が同じハッシュ コードを返す場合があります。

ハッシュ コード自体が安定するとは限りません。 同じ文字列のハッシュ コードは .NET Framework のバージョンが .NET Framework の一つのバージョンのプラットフォーム間で (32 ビット エディションおよび 64 ビットなど) は異なる場合があります。 場合によっては、アプリケーション ドメインによって異なる可能性があります。

その結果、ハッシュ コードが作成されたアプリケーション ドメインの外部でコレクションのキー フィールドとして、使用するですが使用され、保持する必要があります。

最後に厳密な暗号ハッシュが必要な場合は、暗号ハッシュ関数によって返される値の代わりにハッシュ コードを使用しないでください。 暗号に System.Security.Cryptography.HashAlgorithm または System.Security.Cryptography.KeyedHashAlgorithm クラスから派生したクラスをハッシュし、使用します。

ハッシュ コードの詳細については、「Object.GetHashCode」を参照してください。

デスクトップ アプリケーションでは、アプリケーション ドメインごとに一意のハッシュ コードを生成するために <UseRandomizedStringHashAlgorithm> 要素 を使用できます。 これは競合の数を単純化する、ハッシュ テーブルを使用する参照および挿入全体のパフォーマンスが向上します。 次の例に <UseRandomizedStringHashAlgorithm> 要素を使用する方法を示します。 これは、プライベートな文字列定数を含む DisplayString クラス、値が「これである文字列」である sを定義します。また、メソッドを実行しているアプリケーション ドメインの名前と共に文字列値とハッシュ コードを表示する 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());
   }
}


構成ファイルを指定せずにこの例を実行すると、次のような出力が表示されます。 文字列のハッシュ コードが 2 つアプリケーション ドメインで同じであることに注意してください。


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 Framework のバージョンでは、一つのバージョンのプラットフォーム、およびアプリケーション ドメインによって異なる場合があります。 このため、ハッシュ テーブルまたは辞書のキーとしてコード値も使用する必要がありますハッシュ シリアル化や永続化する必要があります。

ハッシュ コードと GetHashCode のメソッドの使用方法の詳細については、「Object.GetHashCode」を参照してください。

呼び出し時の注意

GetHashCode の戻り値は、プラットフォームに依存します。 これは、.NET Framework の 32 ビット バージョンと 64 ビット バージョンで異なります。 また、.NET Framework のバージョン間で異なる場合があります。

Caution メモ注意

ハッシュ コードがハッシュ テーブルに基づくコレクションの効率的な挿入と参照のために用意されています。 ハッシュ コードは永続的な値ではありません。 したがって:

  • ハッシュ コード値をシリアル化したり、データベースに格納しないでください。

  • 変更されたコレクションからオブジェクトを取得するには、キーとしてハッシュ コードを使用しないでください。

  • 暗号ハッシュ関数によって返される値の代わりにハッシュ コードを使用しないでください。 暗号に System.Security.Cryptography.HashAlgorithm または System.Security.Cryptography.KeyedHashAlgorithm クラスから派生したクラスをハッシュし、使用します。

  • 2 種類のオブジェクトが等しいかどうかを判断するためにハッシュ コードの等価をテストしないでください。(等しくないオブジェクトが同一のハッシュ コードを持つことができます。) 等価性をテストするには、ReferenceEquals または Equals のメソッドを呼び出します。

さまざまな入力文字列を使用する GetHashCode メソッドの例を次に示します。


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
*/


.NET Framework

サポート対象 : 4.5.2、4.5.1、4.5、4、3.5、3.0、2.0、1.1、1.0

.NET Framework Client Profile

サポート対象 : 4、3.5 SP1

汎用性のあるクラス ライブラリ

サポート対象 : 汎用性のあるクラス ライブラリ

Windows ストア アプリ用 .NET

サポート対象 : Windows 8

Windows Phone アプリ用 .NET

サポート対象 : Windows Phone 8、Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (サーバー コア ロールはサポート対象外), Windows Server 2008 R2 (SP1 以降でサーバー コア ロールをサポート。Itanium はサポート対象外)

.NET Framework では、各プラットフォームのすべてのバージョンはサポートしていません。サポートされているバージョンについては、「.NET Framework システム要件」を参照してください。

コミュニティの追加

表示:
© 2014 Microsoft