Object.GetHashCode Object.GetHashCode Object.GetHashCode Object.GetHashCode Method

定義

既定のハッシュ関数として機能します。 Serves as the default hash function.

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

戻り値

現在のオブジェクトのハッシュ コード。 A hash code for the current object.

同じか、またはより小さい範囲を持つ数値のハッシュ コードを計算する最も簡単な方法の 1 つ、Int32型は、その値を返すことだけです。One of the simplest ways to compute a hash code for a numeric value that has the same or a smaller range than the Int32 type is to simply return that value. 次の例では、このような実装をNumber構造体。The following example shows such an implementation for a Number structure.

using System;

public struct Number
{
   private int n;

   public Number(int value)
   {
      n = value;
   }

   public int Value
   {
      get { return n; }
   }
   
   public override bool Equals(Object obj)
   {
      if (obj == null || ! (obj is Number)) 
         return false;
      else
         return n == ((Number) obj).n;
   }      
   
   public override int GetHashCode()
   {
      return n;
   }
   
   public override string ToString()
   {
      return n.ToString();
   }
}

public class Example
{
   public static void Main()
   {
      Random rnd = new Random();
      for (int ctr = 0; ctr <= 9; ctr++) {
         int randomN = rnd.Next(Int32.MinValue, Int32.MaxValue);
         Number n = new Number(randomN);
         Console.WriteLine("n = {0,12}, hash code = {1,12}", n, n.GetHashCode());
      }   
   }
}
// The example displays output like the following:
//       n =   -634398368, hash code =   -634398368
//       n =   2136747730, hash code =   2136747730
//       n =  -1973417279, hash code =  -1973417279
//       n =   1101478715, hash code =   1101478715
//       n =   2078057429, hash code =   2078057429
//       n =   -334489950, hash code =   -334489950
//       n =    -68958230, hash code =    -68958230
//       n =   -379951485, hash code =   -379951485
//       n =    -31553685, hash code =    -31553685
//       n =   2105429592, hash code =   2105429592
Public Structure Number
   Private n As Integer

   Public Sub New(value As Integer)
      n = value
   End Sub

   Public ReadOnly Property Value As Integer
      Get
         Return n
      End Get
   End Property
   
   Public Overrides Function Equals(obj As Object) As Boolean
      If obj Is Nothing OrElse Not TypeOf obj Is Number Then
         Return False
      Else
         Return n = CType(obj, Number).n
      End If
   End Function      
   
   Public Overrides Function GetHashCode() As Integer
      Return n
   End Function
   
   Public Overrides Function ToString() As String
      Return n.ToString()
   End Function
End Structure

Module Example
   Public Sub Main()
      Dim rnd As New Random()
      For ctr As Integer = 0 To 9
         Dim randomN As Integer = rnd.Next(Int32.MinValue, Int32.MaxValue)
         Dim n As New Number(randomN)
         Console.WriteLine("n = {0,12}, hash code = {1,12}", n, n.GetHashCode())
      Next
   End Sub
End Module
' The example displays output like the following:
'       n =   -634398368, hash code =   -634398368
'       n =   2136747730, hash code =   2136747730
'       n =  -1973417279, hash code =  -1973417279
'       n =   1101478715, hash code =   1101478715
'       n =   2078057429, hash code =   2078057429
'       n =   -334489950, hash code =   -334489950
'       n =    -68958230, hash code =    -68958230
'       n =   -379951485, hash code =   -379951485
'       n =    -31553685, hash code =    -31553685
'       n =   2105429592, hash code =   2105429592

多くの場合、型には、ハッシュ コードの生成に参加できる複数のデータ フィールドがあります。Frequently, a type has multiple data fields that can participate in generating the hash code. ハッシュ コードを生成する方法の 1 つを使用してこれらのフィールドを結合する、XOR (eXclusive OR)操作は、次の例に示すようにします。One way to generate a hash code is to combine these fields using an XOR (eXclusive OR) operation, as shown in the following example.

using System;

// A type that represents a 2-D point.
public struct Point
{
    private int x;
    private int y;

    public Point(int x, int y)
    {
       this.x = x;
       this.y = y;
    }
    
    public override bool Equals(Object obj)
    {
       if (! (obj is Point)) return false;
       
       Point p = (Point) obj;
       return x == p.x & y == p.y;
    }
    
    public override int GetHashCode()
    { 
        return x ^ y;
    } 
} 

public class Example
{
   public static void Main()
   {
      Point pt = new Point(5, 8);
      Console.WriteLine(pt.GetHashCode());
        
      pt = new Point(8, 5);
      Console.WriteLine(pt.GetHashCode());
   }
}
// The example displays the following output:
//       13
//       13
' A type that represents a 2-D point.
Public Structure Point
    Private x As Integer
    Private y As Integer

    Public Sub New(x As Integer, y As Integer)
       Me.x = x
       Me.y = y
    End Sub
    
    Public Overrides Function Equals(obj As Object) As Boolean
       If Not TypeOf obj Is Point Then Return False
       
       Dim p As Point = CType(obj, Point)
       Return x = p.x And y = p.y
    End Function
    
    Public Overrides Function GetHashCode() As Integer 
        Return x Xor y
    End Function 
End Structure 

Public Module Example
   Public Sub Main() 
      Dim pt As New Point(5, 8)
      Console.WriteLine(pt.GetHashCode())
        
      pt = New Point(8, 5)
      Console.WriteLine(pt.GetHashCode())
   End Sub 
End Module   

前の例は、(n1、n2) の同じハッシュ コードを返します (n2、n1)、および、必要な多数の衝突を生成する可能性があります。The previous example returns the same hash code for (n1, n2) and (n2, n1), and so may generate more collisions than are desirable. このような場合のハッシュ コードが同一でないように、ソリューションの数は使用できます。A number of solutions are available so that hash codes in these cases are not identical. 1 つのハッシュ コードを返すには、Tuple各フィールドの順序を反映するオブジェクト。One is to return the hash code of a Tuple object that reflects the order of each field. 次の例を使用して、考えられる実装を示しています、Tuple<T1,T2>クラス。The following example shows a possible implementation that uses the Tuple<T1,T2> class. ただしをインスタンス化のパフォーマンスのオーバーヘッドをTupleオブジェクトは、ハッシュ テーブルに多数のオブジェクトを格納するアプリケーションの全体的なパフォーマンスに大きな影響可能性があります。Note, though, that the performance overhead of instantiating a Tuple object may significantly impact the overall performance of an application that stores large numbers of objects in hash tables.

using System;

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

    public Point(int x, int y)
    {
       this.x = x;
       this.y = y;
    }
    
    public override bool Equals(Object obj)
    {
       if (!(obj is Point)) return false;
       
       Point p = (Point) obj;
       return x == p.x & y == p.y;
    }
    
    public override int GetHashCode()
    { 
        return Tuple.Create(x, y).GetHashCode();
    } 
} 

public class Example
{
   public static void Main()
   {
        Point pt = new Point(5, 8);
        Console.WriteLine(pt.GetHashCode());
        
        pt = new Point(8, 5);
        Console.WriteLine(pt.GetHashCode());
   }
}
// The example displays the following output:
//       173
//       269
Public Structure Point
    Private x As Integer
    Private y As Integer

    Public Sub New(x As Integer, y As Integer)
       Me.x = x
       Me.y = y
    End Sub
    
    Public Overrides Function Equals(obj As Object) As Boolean
       If Not TypeOf obj Is Point Then Return False
       
       Dim p As Point = CType(obj, Point)
       Return x = p.x And y = p.y
    End Function
    
    Public Overrides Function GetHashCode() As Integer 
        Return Tuple.Create(x, y).GetHashCode()
    End Function 
End Structure 

Public Module Example
    Public Sub Main() 
        Dim pt As New Point(5, 8)
        Console.WriteLine(pt.GetHashCode())
        
        pt = New Point(8, 5)
        Console.WriteLine(pt.GetHashCode())
    End Sub 
End Module         
' The example displays the following output:
'       173
'       269

2 番目の代替ソリューションには、連続するフィールドのハッシュ コードを 2 つ以上のビットを左シフトすることで、個々 のハッシュ コードを重み付けが含まれます。A second alternative solution involves weighting the individual hash codes by left-shifting the hash codes of successive fields by two or more bits. 最適な状態で、破棄されるのではなくを超えて 31 ビット シフトをラップするよりも破棄されます。Optimally, instead of being discarded, bits shifted beyond bit 31 should wrap around rather than be discarded. C# および Visual Basic の両方で左シフト演算子でビットを破棄するので、次のような左 shift キーのラップ メソッドを作成する必要があります。Since bits are discarded by the left-shift operators in both C# and Visual Basic, this requires creating a left shift-and-wrap method like the following:

public int ShiftAndWrap(int value, int positions)
{
    positions = positions & 0x1F;
  
    // Save the existing bit pattern, but interpret it as an unsigned integer.
    uint number = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0);
    // Preserve the bits to be discarded.
    uint wrapped = number >> (32 - positions);
    // Shift and wrap the discarded bits.
    return BitConverter.ToInt32(BitConverter.GetBytes((number << positions) | wrapped), 0);
}
Public Function ShiftAndWrap(value As Integer, positions As Integer) As Integer
   positions = positions And &h1F
   
   ' Save the existing bit pattern, but interpret it as an unsigned integer.
   Dim number As UInteger = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0)
   ' Preserve the bits to be discarded.
   Dim wrapped AS UInteger = number >> (32 - positions)
   ' Shift and wrap the discarded bits.
   Return BitConverter.ToInt32(BitConverter.GetBytes((number << positions) Or wrapped), 0)
End Function

次の例は、のハッシュ コードを計算するこのシフトのラップ メソッドを使用するし、Point前の例で使用される構造体。The following example then uses this shift-and-wrap method to compute the hash code of the Point structure used in the previous examples.

using System;

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

    public Point(int x, int y)
    {
       this.x = x;
       this.y = y;
    }
    
    public override bool Equals(Object obj)
    {
       if (!(obj is Point)) return false;
       
       Point p = (Point) obj;
       return x == p.x & y == p.y;
    }
    
    public override int GetHashCode()
    { 
        return ShiftAndWrap(x.GetHashCode(), 2) ^ y.GetHashCode();
    } 
    
    private int ShiftAndWrap(int value, int positions)
    {
        positions = positions & 0x1F;
      
        // Save the existing bit pattern, but interpret it as an unsigned integer.
        uint number = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0);
        // Preserve the bits to be discarded.
        uint wrapped = number >> (32 - positions);
        // Shift and wrap the discarded bits.
        return BitConverter.ToInt32(BitConverter.GetBytes((number << positions) | wrapped), 0);
    }
} 

public class Example
{
   public static void Main()
   {
        Point pt = new Point(5, 8);
        Console.WriteLine(pt.GetHashCode());
        
        pt = new Point(8, 5);
        Console.WriteLine(pt.GetHashCode());
   }
}
// The example displays the following output:
//       28
//       37 
Public Structure Point
    Private x As Integer
    Private y As Integer

    Public Sub New(x As Integer, y As Integer)
       Me.x = x
       Me.y = y
    End Sub
    
    Public Overrides Function Equals(obj As Object) As Boolean
       If Not TypeOf obj Is Point Then Return False
       
       Dim p As Point = CType(obj, Point)
       Return x = p.x And y = p.y
    End Function
    
    Public Overrides Function GetHashCode() As Integer 
        Return ShiftAndWrap(x.GetHashCode(), 2) XOr y.GetHashCode()
    End Function 
    
    Private Function ShiftAndWrap(value As Integer, positions As Integer) As Integer
        positions = positions And &h1F
      
        ' Save the existing bit pattern, but interpret it as an unsigned integer.
        Dim number As UInteger = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0)
        ' Preserve the bits to be discarded.
        Dim wrapped AS UInteger = number >> (32 - positions)
        ' Shift and wrap the discarded bits.
        Return BitConverter.ToInt32(BitConverter.GetBytes((number << positions) Or wrapped), 0)
    End Function
End Structure 

Module Example
   Public Sub Main()
        Dim pt As New Point(5, 8)
        Console.WriteLine(pt.GetHashCode())
        
        pt = New Point(8, 5)
        Console.WriteLine(pt.GetHashCode())
   End Sub
End Module
' The example displays the following output:
'       28
'       37

注釈

ハッシュ コードが挿入およびなどハッシュ ベースのコレクション内のオブジェクトを識別するために使用する数値、Dictionary<TKey,TValue>クラス、Hashtableクラス、または型から派生した、DictionaryBaseクラス。A hash code is a numeric value that is used to insert and identify an object in a hash-based collection such as the Dictionary<TKey,TValue> class, the Hashtable class, or a type derived from the DictionaryBase class. GetHashCodeメソッドは、アルゴリズムのオブジェクトの等価性の簡単なチェックを必要があります。 このハッシュ コードを提供します。The GetHashCode method provides this hash code for algorithms that need quick checks of object equality.

注意

ハッシュ テーブルのハッシュ コードを使用する方法についての情報といくつかの追加のハッシュ コード アルゴリズムを参照してください、ハッシュ関数Wikipedia 内のエントリ。For information about how hash codes are used in hash tables and for some additional hash code algorithms, see the Hash Function entry in Wikipedia.

等しいと同じ戻り値のハッシュ コードを 2 つのオブジェクト。Two objects that are equal return hash codes that are equal. ただし、その逆は true。 (等しくない) の異なるオブジェクトが同一のハッシュ コードを持てないため、同じハッシュ コードをオブジェクトの等価性を意味しません。However, the reverse is not true: equal hash codes do not imply object equality, because different (unequal) objects can have identical hash codes. さらに、.NET Framework とは限りませんの既定の実装、GetHashCodeメソッド、およびこのメソッドで異なる場合がありますを返す .NET Framework のバージョンと 32 ビットおよび 64 ビットのプラットフォームなどのプラットフォームの値。Furthermore, the .NET Framework does not guarantee the default implementation of the GetHashCode method, and the value this method returns may differ between .NET Framework versions and platforms, such as 32-bit and 64-bit platforms. これらの理由から、使わないこのメソッドの既定の実装固有のオブジェクト識別子としてハッシュの目的で。For these reasons, do not use the default implementation of this method as a unique object identifier for hashing purposes. これから次の 2 つの影響。Two consequences follow from this:

  • 等しいハッシュ コードがオブジェクトの等価性を意味する想定しないでください。You should not assume that equal hash codes imply object equality.

  • なるか、同じオブジェクトをアプリケーション ドメイン、プロセス、およびプラットフォーム間でハッシュ可能性がありますのでが作成されたアプリケーション ドメインの外部ハッシュ コードを使用する必要があることはありません。You should never persist or use a hash code outside the application domain in which it was created, because the same object may hash across application domains, processes, and platforms.

警告

ハッシュ コードは、効率的な挿入とハッシュ テーブルに基づくコレクション内の参照です。A hash code is intended for efficient insertion and lookup in collections that are based on a hash table. ハッシュ コードは、永続的な値ではありません。A hash code is not a permanent value. このためには。For this reason:

  • ハッシュ コード値をシリアル化したり、それらをデータベースに保存しないでください。Do not serialize hash code values or store them in databases.
  • キー付きコレクションからオブジェクトを取得するのにキーとしてハッシュ コードを使用できません。Do not use the hash code as the key to retrieve an object from a keyed collection.
  • アプリケーション ドメインまたはプロセスの間では、ハッシュ コードを送信しません。Do not send hash codes across application domains or processes. 場合によっては、ハッシュ コードをプロセスごとまたはアプリケーションごとのドメインごとに計算することがあります。In some cases, hash codes may be computed on a per-process or per-application domain basis.
  • 強力な暗号的ハッシュを作成する必要がある場合は、暗号化ハッシュ関数によって返される値ではなくハッシュ コードを使わないでください。Do not use the hash code instead of a value returned by a cryptographic hashing function if you need a cryptographically strong hash. 暗号化ハッシュから派生したクラスを使用して、System.Security.Cryptography.HashAlgorithmまたはSystem.Security.Cryptography.KeyedHashAlgorithmクラス。For cryptographic hashes, use a class derived from the System.Security.Cryptography.HashAlgorithm or System.Security.Cryptography.KeyedHashAlgorithm class.
  • ハッシュ コードを 2 つのオブジェクトが等しいかどうかを判断するには、等しいかどうかをテストしないでください。Do not test for equality of hash codes to determine whether two objects are equal. (等しくないオブジェクトは、同一のハッシュ コードを持つことができます)等しいかどうかをテストするには、呼び出し、ReferenceEqualsまたはEqualsメソッド。(Unequal objects can have identical hash codes.) To test for equality, call the ReferenceEquals or Equals method.

GetHashCode派生型でメソッドをオーバーライドすることができます。The GetHashCode method can be overridden by a derived type. 場合GetHashCodeがオーバーライドされていないハッシュ コードを呼び出すことによって計算が参照型、Object.GetHashCodeハッシュ コードを計算する基本クラスのメソッド ベースのオブジェクトの参照の詳細についてを参照してくださいRuntimeHelpers.GetHashCodeします。If GetHashCode is not overridden, hash codes for reference types are computed by calling the Object.GetHashCode method of the base class, which computes a hash code based on an object's reference; for more information, see RuntimeHelpers.GetHashCode. つまり、2 つのオブジェクトをReferenceEqualsメソッドを返します。trueされた同一のハッシュ コード。In other words, two objects for which the ReferenceEquals method returns true have identical hash codes. 値の型をオーバーライドしない場合GetHashCodeValueType.GetHashCode基本クラスのメソッドでは、リフレクションを使用して、型のフィールドの値に基づいてハッシュ コードを計算します。If value types do not override GetHashCode, the ValueType.GetHashCode method of the base class uses reflection to compute the hash code based on the values of the type's fields. つまり、フィールドが同じ値を持つ値の型では、同じハッシュ コードがあります。In other words, value types whose fields have equal values have equal hash codes. オーバーライドの詳細についてはGetHashCode、「ノート継承クラス」を参照してください。For more information about overriding GetHashCode, see the "Notes to Inheritors" section.

警告

オーバーライドする場合、GetHashCodeメソッドをオーバーライドすることがもEquals、またはその逆です。If you override the GetHashCode method, you should also override Equals, and vice versa. 場合、オーバーライドされたEqualsメソッドを返します。true等しいかどうか、オーバーライドされた 2 つのオブジェクトをテストするときにGetHashCodeメソッドは、2 つのオブジェクトに対して同じ値を返す必要があります。If your overridden Equals method returns true when two objects are tested for equality, your overridden GetHashCode method must return the same value for the two objects.

ハッシュ テーブル内のキーとして使用されるオブジェクトがの便利な実装を提供しないかどうかGetHashCode、ハッシュ コード プロバイダーを指定するには指定することによって、IEqualityComparerのオーバー ロードのいずれかに実装、Hashtableクラスのコンス トラクター。If an object that is used as a key in a hash table does not provide a useful implementation of GetHashCode, you can specify a hash code provider by supplying an IEqualityComparer implementation to one of the overloads of the Hashtable class constructor.

ノートには、 Windows ランタイムWindows RuntimeNotes for the Windows ランタイムWindows Runtime

呼び出すと、GetHashCode内のクラスのメソッド、 Windows ランタイムWindows Runtime、既定の動作をオーバーライドしないクラスを提供しますGetHashCodeします。When you call the GetHashCode method on a class in the Windows ランタイムWindows Runtime, it provides the default behavior for classes that don't override GetHashCode. これは、.NET Framework では、サポートの一部、 Windows ランタイムWindows Runtime (を参照してくださいフレームワークをサポートして Windows ストア アプリ用 .NET と Windows ランタイム)。This is part of the support that the .NET Framework provides for the Windows ランタイムWindows Runtime (see .NET Framework Support for Windows Store Apps and Windows Runtime). クラス、Windows ランタイムWindows Runtime継承しないObject、現在実装されていないと、GetHashCodeします。Classes in the Windows ランタイムWindows Runtime don't inherit Object, and currently don't implement a GetHashCode. ただし、あるように見えますToStringEquals(Object)GetHashCodeメソッド、c# または Visual Basic のコードで使用すると、.NET Framework は、これらのメソッドの既定の動作を提供します。However, they appear to have ToString, Equals(Object), and GetHashCode methods when you use them in your C# or Visual Basic code, and the .NET Framework provides the default behavior for these methods.

注意

Windows ランタイムWindows Runtime c# または Visual Basic で記述されたクラスでオーバーライドできます、GetHashCodeメソッド。classes that are written in C# or Visual Basic can override the GetHashCode method.

注意 (継承者)

ハッシュ関数を使用して、オブジェクトの値に対応する番号 (ハッシュ コード) をすばやく生成します。 A hash function is used to quickly generate a number (hash code) that corresponds to the value of an object. ハッシュ関数は通常、各種類に固有し、一意である、する必要があります少なくとも 1 つのインスタンス フィールドの入力として使用します。 Hash functions are usually specific to each type and, for uniqueness, must use at least one of the instance fields as input. 静的フィールドの値を使用して、ハッシュ コードを計算する必要がありません。 Hash codes should not be computed by using the values of static fields. 派生したクラスのObjectGetHashCodeメソッドが基底クラスに委任できるGetHashCode()実装の派生クラスには参照の等価性に等しいかどうかが定義されている場合のみです。 For classes derived from Object, the GetHashCode method can delegate to the base class GetHashCode() implementation only if the derived class defines equality to be reference equality. 既定の実装GetHashCode()参照型で返されると等価のハッシュ コードを返します、GetHashCode(Object)メソッド。 The default implementation of GetHashCode() for reference types returns a hash code that is equivalent to the one returned by the GetHashCode(Object) method. オーバーライドできますGetHashCode()変更不可の参照の種類。 You can override GetHashCode() for immutable reference types. 一般に、変更可能な参照型でオーバーライドするGetHashCode()場合にのみ。 In general, for mutable reference types, you should override GetHashCode() only if: は変更できません。 フィールドのハッシュ コードを計算できます。または - You can compute the hash code from fields that are not mutable; or ハッシュ コードに依存しているコレクションに含まれていますが、オブジェクトに、変更可能なオブジェクトのハッシュ コードが変更されないことを保証できます。 - You can ensure that the hash code of a mutable object does not change while the object is contained in a collection that relies on its hash code. それ以外の場合、ハッシュ テーブルで変更可能なオブジェクトが失われることを考える場合があります。 Otherwise, you might think that the mutable object is lost in the hash table. オーバーライドする場合はGetHashCode()変更可能な参照型の場合、ドキュメントがようにクリア オブジェクトがハッシュ テーブルに格納されている場合、型のユーザーがオブジェクトの値を変更しないでください。 If you do choose to override GetHashCode() for a mutable reference type, your documentation should make it clear that users of your type should not modify object values while the object is stored in a hash table. 値型の場合は、GetHashCode()リフレクションを使用する既定のハッシュ コード実装を提供します。 For value types, GetHashCode() provides a default hash code implementation that uses reflection. パフォーマンス向上のためにオーバーライドすることを検討する必要があります。 You should consider overriding it for better performance.

詳細とさまざまな方法でのハッシュ コードを計算する例については、「例」を参照してください。 For more information and examples that compute hash codes in a variety of ways, see the Examples section.

ハッシュ関数は次のプロパティがあります。 A hash function must have the following properties: 場合、2 つのオブジェクトが等しいと評価、比較、GetHashCode()の各オブジェクトのメソッドは、同じ値を返す必要があります。 - If two objects compare as equal, the GetHashCode() method for each object must return the same value. ただし、2 つのオブジェクトが等しく、として比較されない場合、 GetHashCode() 2 つのオブジェクトのメソッドは、異なる値を返す必要はありません。 However, if two objects do not compare as equal, the GetHashCode() methods for the two objects do not have to return different values. -GetHashCode()メソッドは、オブジェクトがオブジェクトの戻り値を決定するオブジェクトの状態に変更がない限り、同じハッシュ コードを返す必要があります一貫してSystem.Object.Equalsメソッド。 - The GetHashCode() method for an object must consistently return the same hash code as long as there is no modification to the object state that determines the return value of the object's System.Object.Equals method. これが、アプリケーションの現在の実行にのみ true であると、アプリケーションをもう一度実行している場合に他のハッシュ コードを返すことことに注意してください。 Note that this is true only for the current execution of an application, and that a different hash code can be returned if the application is run again. -については、最適なパフォーマンスを大きくがクラスター化されている入力を含む、すべての入力に対して均等に分散にハッシュ関数が生成されます。 - For the best performance, a hash function should generate an even distribution for all input, including input that is heavily clustered. ハッシュ テーブルの最適なパフォーマンスの結果のハッシュ コードに対する大規模な変更でオブジェクトの状態の小さい変更があります。 An implication is that small modifications to object state should result in large modifications to the resulting hash code for best hash table performance. ハッシュ関数は、コストを計算することがあります。 - Hash functions should be inexpensive to compute. -GetHashCode()メソッドが例外をスローする必要があります。 - The GetHashCode() method should not throw exceptions. 実装など、GetHashCode()メソッドによって提供される、Stringクラスは、まったく同じ文字列値の同一のハッシュ コードを返します。 For example, the implementation of the GetHashCode() method provided by the String class returns identical hash codes for identical string values. そのため、2 つStringオブジェクトが同じ文字列値を表す場合、同じハッシュ コードを返します。 Therefore, two String objects return the same hash code if they represent the same string value. また、メソッドを使用して、すべての文字文字列の入力が特定の範囲でクラスター化する場合でも、ある程度ランダムに分散型の出力を生成する (たとえば、多くのユーザーの場合でも、下位 128 ASCII 文字のみを含む文字列がある、文字列を含めたりする 65,535 の Unicode 文字の)。 Also, the method uses all the characters in the string to generate reasonably randomly distributed output, even when the input is clustered in certain ranges (for example, many users might have strings that contain only the lower 128 ASCII characters, even though a string can contain any of the 65,535 Unicode characters). クラスの適切なハッシュ関数を提供すると、それらのオブジェクトをハッシュ テーブルに追加のパフォーマンスは大きく変わります。 Providing a good hash function on a class can significantly affect the performance of adding those objects to a hash table. ハッシュ関数の適切な実装を提供するキーを持つハッシュ テーブルには、要素の検索と (たとえば、o (1) 操作など) の定数の時間がかかります。 In a hash table with keys that provide a good implementation of a hash function, searching for an element takes constant time (for example, an O(1) operation). ハッシュ関数の不適切な実装でのハッシュ テーブルに、検索のパフォーマンスがハッシュ テーブル内の項目の数に依存 (たとえば、O (n) 操作、場所nはハッシュ テーブル内の項目の数です)。 In a hash table with a poor implementation of a hash function, the performance of a search depends on the number of items in the hash table (for example, an O(n) operation, where n is the number of items in the hash table). 悪意のあるユーザーは、次の条件下で、ハッシュ テーブルに依存するアプリケーションのパフォーマンスを大幅に低下することができます、競合の数を増やすためのデータを入力できます。 A malicious user can input data that increases the number of collisions, which can significantly degrade the performance of applications that depend on hash tables, under the following conditions: -ハッシュ関数は、頻繁に競合を作成します。 - When hash functions produce frequent collisions. -ハッシュ テーブル内のオブジェクトの大部分が等しいか、いずれかの別のおよそのハッシュ コードを生成します。 - When a large proportion of objects in a hash table produce hash codes that are equal or approximately equal to one another. -ユーザーは、ハッシュ コードの計算元となるデータを入力します。 - When users input the data from which the hash code is computed. オーバーライドするクラスを派生GetHashCode()もオーバーライドする必要がありますEquals(Object)等しいと見なされる 2 つのオブジェクトに同じハッシュ コードがあることを保証するために、それ以外の場合、Hashtable型が正しく機能しない可能性があります。 Derived classes that override GetHashCode() must also override Equals(Object) to guarantee that two objects considered equal have the same hash code; otherwise, the Hashtable type might not work correctly.

適用対象

こちらもご覧ください