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.

型とInt32は異なる数値のハッシュコードを計算する最も簡単な方法の1つは、単にその値を返すことです。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. ビットは Visual Basic との両方C#の左シフト演算子によって破棄されるため、次のような左シフトアンドラップメソッドを作成する必要があります。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

次の例では、この shift キーと wrap メソッドを使用して、前の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 のHash 関数のエントリを参照してください。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 では、 GetHashCodeメソッドの既定の実装は保証されません。また、このメソッドが返す値は、異なるバージョンの .NET Framework や .net Core などの .net 実装と、32ビットや64ビットプラットフォーム。Furthermore, .NET does not guarantee the default implementation of the GetHashCode method, and the value this method returns may differ between .NET implementations, such as different versions of .NET Framework and .NET Core, 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. 言い換えると、メソッドがReferenceEquals返すtrue 2 つのオブジェクトのハッシュコードが同じであるということです。In other words, two objects for which the ReferenceEquals method returns true have identical hash codes. 値型がオーバーライドGetHashCodeされない場合、基本クラスのメソッドはValueType.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. 2つのEqualsオブジェクトがtrue等しいかどうかをテストするときに、 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便利な実装を提供していない場合は、 HashtableクラスコンストラクターのIEqualityComparerいずれかのオーバーロードに実装を指定することで、ハッシュコードプロバイダーを指定できます。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 GetHashCodeクラスでメソッドを呼び出すと、オーバーライドされないクラスの既定の動作が提供されます。 Windows ランタイムWindows RuntimeWhen 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. これは、 Windows ランタイムWindows Runtime .NET Framework がに提供するサポートの一部です (「 Windows ストアアプリと Windows ランタイムの .NET Framework サポート」を参照してください)。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. ただし、これらのメソッドをToString C#またEquals(Object)は Visual Basic GetHashCodeコードで使用する場合は、、、およびの各メソッドがあるように見えます。 .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または Visual Basic にC#記述されているクラス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.

からObject派生したクラスのGetHashCode場合、メソッドは、派生クラス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 メソッドの戻り値を決定する[オブジェクトの状態](xref: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](xref: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. たとえば、 Stringクラスによって提供GetHashCode()されるメソッドの実装は、同一の文字列値に対して同一のハッシュコードを返します。For example, the implementation of the GetHashCode() method provided by the String class returns identical hash codes for identical string values. したがって、 String 2 つのオブジェクトが同じ文字列値を表す場合は、同じハッシュコードを返します。Therefore, two String objects return the same hash code if they represent the same string value. また、入力が特定の範囲内でクラスター化されている場合でも、メソッドは文字列内のすべての文字を使用して、適度にランダムに分散された出力を生成します。たとえば、多くのユーザーは、128の ASCII 文字のみを含む文字列を持つこともできます。文字列には、65535の 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.

適用対象

こちらもご覧ください