Object.GetHashCode メソッドとは? わかりやすく解説

Weblio 辞書 > コンピュータ > .NET Framework クラス ライブラリ リファレンス > Object.GetHashCode メソッドの意味・解説 

Object.GetHashCode メソッド

特定の型のハッシュ関数として機能しますGetHashCode は、ハッシュ アルゴリズムや、ハッシュ テーブルのようなデータ構造での使用適してます。

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

解説解説

このメソッドは、派生クラスオーバーライドできますハッシュ テーブル有効な分散実現し、値クラスに対して適切なハッシュ関数提供するには、値クラスでこのメソッドオーバーライドする必要があります。このメソッド使用してハッシュ コード生成するには、ハッシュ テーブルキーとして使用されるオブジェクトが必要であるため、ハッシュ テーブルキーとして使用される可能性のあるクラスでこのメソッドオーバーライドする必要もあります。ただし、キーとして使用されるオブジェクトの GetHashCode の実装利用しやすくない場合は、Hashtable構築時に、System.Collections.IHashCodeProvider インターフェイス基づいた別のハッシュ コード プロバイダを提供できます

GetHashCode既定実装では、一意性や一貫性は保証されません。したがってハッシュ用の一意オブジェクト識別子として使用しないください派生クラスでは、一意ハッシュ コード返す実装使用して GetHashCodeオーバーライドする必要があります。処理を適切に行うには、ハッシュ コードは、静的フィールドプロパティではなくインスタンス フィールドインスタンス プロパティの値に基づいたものにする必要があります

実装時の注意 ハッシュ関数使用すると、オブジェクトの値に対応する番号 (ハッシュ コード) を迅速に生成できます通常ハッシュ関数は各 Type固有であり、1 つ上のインスタンス フィールド入力として使用する必要がありますハッシュ関数には、次のプロパティ指定されている必要があります

たとえば、String クラスによる GetHashCode 実装は、一意文字列値に対し一意ハッシュ コード返します。つまり、2 つString オブジェクトが同じ文字列値を参照している場合には、これらのオブジェクトは同じハッシュ コード返します。このメソッドは、入力データ特定の範囲集中している場合でも、文字列文字をすべて使用して適度にランダムな分散出力生成します。たとえば、多くユーザー128小文字ASCII 文字だけで構成されている文字列使用しますが、この場合でも生成される出力文字列には 65,535 の Unicode 文字いずれか含まれます。 GetHashCode は、オブジェクトのどのインスタンスに対しても、常に同じ値を返す必要がありますObject派生クラスが値の等価参照等価として定義しており、値型以外の型である場合限りGetHashCodeObject.GetHashCode 実装に処理を代行させることができますクラスに対して適切なハッシュ関数指定すると、オブジェクトハッシュ テーブル追加する処理のパフォーマンス向上します適切に実装したハッシュ関数使用したハッシュ テーブルでは、要素検索時間一定なります (たとえば、O(1) 操作など)。ハッシュ関数実装適切でないハッシュ テーブルでは、検索処理のパフォーマンスハッシュ テーブル内の項目数によって変化します。この例としては、O(n) 操作などがありますnハッシュ テーブル内の項目数示しますまた、ハッシュ関数計算負荷が低い必要もありますGetHashCode実装結果として循環参照ならないようにする必要があります。たとえば ClassA.GetHashCodeClassB.GetHashCode呼び出す場合は、ClassB.GetHashCode直接的に間接的にClassA.GetHashCode呼び出すことのないようにしてくださいGetHashCode実装は、例外スローできません。 等価であると見なされる 2 つオブジェクトが、同じハッシュ コードを持つようにするため、GetHashCodeオーバーライドする派生クラスEqualsオーバーライドする必要がありますこのようにオーバーライドしないと、Hashtable適切に機能しないことがあります
使用例使用例

場合によっては、整数値を返す目的でだけ GetHashCode実装されています。整数値を返す GetHashCode の実装を示すコード例次に示します

using System;

public struct Int32 {
   public int value;

   //other methods...

   public override int GetHashCode() {
      return value;
   }
}
using namespace System;
public value struct Int32
{
public:
   int value;

   //other methods...
   virtual int GetHashCode() override
   {
      return value;
   }

};
import System.*;
public class Int32
{
    public int value;

    //other methods...
    public int GetHashCode()
    {
        return value;
    } //GetHashCode
} //Int32

ハッシュ コード生成使用できる複数データ フィールドが型に含まれていることがよくありますハッシュ コード生成する方法として、XOR (eXclusive OR) 演算使用してこれらのフィールド結合する方法ありますこの方法を次のコード例示します

using System;

public struct Point {
   public int x;
   public int y; 

   //other methods
   
   public override int GetHashCode() {
      return x ^ y;
   }
}

XOR (eXclusive OR)使用して型のフィールド結合しハッシュ コード生成する方法コード例次に示します。このコード例では、フィールドユーザー定義型を表しており、それぞれのユーザー定義型が GetHashCodeEquals実装している点に注意してください

using System;

public class SomeType {
   public override int GetHashCode() {
     return 0;
   }
}

public class AnotherType {
   public override int GetHashCode() {
     return 1;
   }
}

public class LastType {
   public override int GetHashCode() {
     return 2;
   }
}

public class MyClass {
   SomeType a = new SomeType();
   AnotherType b = new AnotherType();
   LastType c = new LastType();

   public override int GetHashCode () {
     return a.GetHashCode() ^ b.GetHashCode() ^ c.GetHashCode();
   }
}
using namespace System;
public ref class SomeType
{
public:
   virtual int GetHashCode() override
   {
      return 0;
   }

};

public ref class AnotherType
{
public:
   virtual int GetHashCode() override
   {
      return 1;
   }

};

public ref class LastType
{
public:
   virtual int GetHashCode() override
   {
      return 2;
   }

};

public ref class MyClass
{
private:
   SomeType^ a;
   AnotherType^ b;
   LastType^ c;

public:
   virtual int GetHashCode() override
   {
      return a->GetHashCode() ^ b->GetHashCode() ^ c->GetHashCode();
   }

};
import System;

public class SomeType {
   public override function GetHashCode():
 int  {
     return 0;
   }
}

public class AnotherType {
   public override function GetHashCode():
 int {
     return 1;
   }
}

public class LastType {
   public override function GetHashCode():
 int {
     return 2;
   }
}

public class MyClass {
   var a: SomeType  = new SomeType();
   var b: AnotherType = new AnotherType();
   var c: LastType = new LastType();

   public override function GetHashCode ()
 : int {
     return a.GetHashCode() ^ b.GetHashCode() ^ c.GetHashCode();
   }
}

派生クラスデータ メンバが Int32 よりも大き場合次のコード例に示す XOR (eXclusive OR) 演算使用してその値の上ビット下位ビット結合できます

using System;

public struct Int64 {
   public long value;

   //other methods...

   public override int GetHashCode() {
      return ((int)value ^ (int)(value
 >> 32));
   }
}
using namespace System;
public value struct Int64
{
public:
   long value;

   //other methods...

   virtual int GetHashCode() override
   {
      return ((int)value ^ (int)(value
 >> 32));
   }
};
import System;

public class Int64 {
   var value : long;

   //other methods...

   public override function GetHashCode() :
 int {
      return (int(value) ^ int(value
 >> 32));
   }   
   
   function Int64(myValue : long) {
      value = myValue;
   }
}
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「Object.GetHashCode メソッド」の関連用語

Object.GetHashCode メソッドのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



Object.GetHashCode メソッドのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2024 Microsoft.All rights reserved.

©2024 GRAS Group, Inc.RSS