この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

String.GetHashCode メソッド ()

 

公開日: 2016年10月

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

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

public override int GetHashCode()

戻り値

Type: System.Int32

32 ビット符号付き整数ハッシュ コード。

動作 GetHashCode はその実装は、共通言語ランタイムの 1 つのバージョン別に異なる可能性がありますに依存します。 なぜこのエラーが発生する理由は、のパフォーマンスを向上させる GetHashCodeします。

System_CAPS_important重要

2 つの文字列オブジェクトが等しい場合、 GetHashCode メソッドと同じ値を返します。 ただし、一意の文字列値ごとに一意のハッシュ コード値はありません。 別の文字列には、同じハッシュ コードを返すことができます。

ハッシュ コード自体は、安定しているは保証されません。 同一の文字列のハッシュ コードは、.NET Framework のバージョンと .NET Framework の 1 つのバージョン (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

System_CAPS_important重要

ハッシュ コードは、挿入し、ハッシュ テーブルからキーを持つオブジェクトを効率的に取得に使用されます。 ただし、ハッシュ コードは文字列を一意に識別しないでください。 同一の文字列と同じハッシュ コードが共通言語ランタイムは同じハッシュ コードを別の文字列に割り当てることもできます。 さらに、ハッシュ コードでは、.NET Framework のバージョン、1 つのバージョンでプラットフォームおよびアプリケーション ドメインを変更できます。 このためは、いないシリアル化またはハッシュ コード値を保持する必要がありますもする必要がありますとして使用するハッシュ テーブルまたは辞書内のキー。

ハッシュ コードの使用についてのおよび GetHashCode メソッドを参照してください Object.GetHashCodeします。

呼び出し時の注意:

によって返される値 GetHashCode プラットフォームに依存します。 これは、.NET Framework の 32 ビットおよび 64 ビット バージョンで異なります。 .NET Framework のバージョンによって異なることもできます。

System_CAPS_warning警告

ハッシュ コードは、効率的な挿入およびハッシュ テーブルに基づくコレクションで検索します。 ハッシュ コードは、永続的な値ではありません。 このためには。

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

  • キー付きのコレクションからオブジェクトを取得するのに、キーとしてハッシュ コードを使用しません。

  • 暗号ハッシュ関数によって返される値ではなくハッシュ コードを使用しません。 暗号ハッシュから派生するクラスを使用して、 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
*/

ユニバーサル Windows プラットフォーム
8 以降で使用可能
.NET Framework
1.1 以降で使用可能
ポータブル クラス ライブラリ
サポート対象: 移植可能 .NET プラットフォーム
Silverlight
2.0 以降で使用可能
Windows Phone Silverlight
7.0 以降で使用可能
Windows Phone
8.1 以降で使用可能
トップに戻る
表示: