次の方法で共有


Object.GetHashCode メソッド

定義

既定のハッシュ関数として機能します。

public:
 virtual int GetHashCode();
public virtual int GetHashCode ();
abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int
Public Overridable Function GetHashCode () As Integer

戻り値

現在のオブジェクトのハッシュ コード。

注釈

この API の詳細については、「 Object.GetHashCode の補足 API 解説」を参照してください。

注意 (継承者)

ハッシュ関数は、オブジェクトの値に対応する数値 (ハッシュ コード) をすばやく生成するために使用されます。 ハッシュ関数は通常、各型に固有であり、一意性のために、少なくとも 1 つのインスタンス フィールドを入力として使用する必要があります。 ハッシュ コードは、静的フィールドの値を使用して計算しないでください。

から Object派生したクラスの場合、 GetHashCode 派生クラス GetHashCode() が参照の等価性として等しいと定義されている場合にのみ、 メソッドは基底クラスの実装にデリゲートできます。 参照型の の既定の GetHashCode() 実装では、 メソッドによって返されるハッシュ コードと同等のハッシュ コードが GetHashCode(Object) 返されます。 変更できない参照型の場合は、 をオーバーライド GetHashCode() できます。 一般に、変更可能な参照型の場合は、次の場合にのみオーバーライド GetHashCode() する必要があります。

  • 変更できないフィールドからハッシュ コードを計算できます。または

  • オブジェクトがハッシュ コードに依存するコレクションに含まれている間、変更可能なオブジェクトのハッシュ コードが変更されないようにすることができます。

そうしないと、変更可能なオブジェクトがハッシュ テーブルで失われたと考える場合があります。 変更可能な参照型のオーバーライド GetHashCode() を選択した場合、ドキュメントでは、オブジェクトがハッシュ テーブルに格納されている間、型のユーザーがオブジェクトの値を変更しないことを明確にする必要があります。

値型の場合、 GetHashCode() はリフレクションを使用する既定のハッシュ コード実装を提供します。 パフォーマンスを向上させるには、オーバーライドすることを検討する必要があります。

ハッシュ コードをさまざまな方法で計算する詳細と例については、「例」セクションを参照してください。

ハッシュ関数には、次のプロパティが必要です。

  • 2 つのオブジェクトが等しいと比較する場合、各オブジェクトの GetHashCode() メソッドは同じ値を返す必要があります。 ただし、2 つのオブジェクトが等しいと比較されない場合、 GetHashCode() 2 つのオブジェクトのメソッドは異なる値を返す必要はありません。

  • オブジェクトのメソッドは GetHashCode() 、オブジェクトの System.Object.Equals メソッドの戻り値を決定するオブジェクトの状態に変更がない限り、同じハッシュ コードを一貫して返す必要があります。 これは、アプリケーションの現在の実行に対してのみ当てはまります。また、アプリケーションを再度実行した場合は、別のハッシュ コードを返すことができます。

  • 最適なパフォーマンスを得るには、ハッシュ関数は、大量にクラスター化された入力を含むすべての入力に対して偶数分布を生成する必要があります。 つまり、オブジェクトの状態を小さく変更すると、結果として得られるハッシュ コードが大きく変更され、最適なハッシュ テーブルのパフォーマンスが得られます。

  • ハッシュ関数は、計算に安価である必要があります。

  • メソッドは例外を GetHashCode() スローしないでください。

たとえば、 クラスによって提供される メソッドの GetHashCode() 実装では String 、同じ文字列値に対して同じハッシュ コードが返されます。 したがって、2 つの String オブジェクトが同じ文字列値を表す場合、同じハッシュ コードを返します。 また、 メソッドは、文字列内のすべての文字を使用して、入力が特定の範囲にクラスター化されている場合でも、合理的にランダムに分散された出力を生成します (たとえば、文字列には 65,535 個の Unicode 文字のいずれかを含めることができる場合でも、下位 128 文字の ASCII 文字のみを含む文字列が多い場合があります)。

クラスに適切なハッシュ関数を指定すると、それらのオブジェクトをハッシュ テーブルに追加するパフォーマンスに大きな影響を与える可能性があります。 ハッシュ関数の適切な実装を提供するキーを持つハッシュ テーブルでは、要素の検索には一定の時間がかかります (たとえば、O(1) 操作)。 ハッシュ関数の実装が不適切なハッシュ テーブルでは、検索のパフォーマンスは、ハッシュ テーブル内の項目の数 (O(n) 操作などによって異なります。ここで n 、 はハッシュ テーブル内の項目の数です)。 悪意のあるユーザーは、競合の数を増やすデータを入力する可能性があります。これにより、次の条件下で、ハッシュ テーブルに依存するアプリケーションのパフォーマンスが大幅に低下する可能性があります。

  • ハッシュ関数によって頻繁に競合が発生する場合。

  • ハッシュ テーブル内のオブジェクトの大部分が、互いに等しいかほぼ等しいハッシュ コードを生成する場合。

  • ユーザーがハッシュ コードの計算元のデータを入力したとき。

等しいと見なされる 2 つのオブジェクトが同じハッシュ コードを持っていることを保証するために、 をオーバーライド GetHashCode() する派生クラスもオーバーライド Equals(Object) する必要があります。それ以外の場合は、型が Hashtable 正しく動作しない可能性があります。

適用対象

こちらもご覧ください