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 형식은 단순히 해당 값을 반환 합니다.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. 해시 코드를 생성 하는 한 가지 방법은 사용 하 여 이러한 필드를 결합 하는 것을 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. 해시 코드를 반환 하는 경우 하나는 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

두 번째 대체 솔루션으로 비트를 두 개 이상의 연속 된 필드의 해시 코드를 왼쪽-이동 하 여 개별 해시 코드를 가중치 포함 됩니다.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 왼쪽 시프트 연산자가 무시 되는 있으므로이 다음과 같이 왼쪽된 시프트 및 줄 바꿈 메서드 만들기 필요 합니다.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 및 줄 바꿈의 해시 코드를 계산 하는 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.

두 개체는 동일한 반환는 같은 해시 코드입니다.Two objects that are equal return hash codes that are equal. 그러나는 성립 되지: 다른 (같지 않음) 개체는 동일한 해시 코드를 포함할 수 있으므로 같은 해시 코드를 개체 같음 나타내지 않습니다.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 메서드와이 메서드가 반환 다 32 비트 및 64 비트 플랫폼 등의 플랫폼 및.NET Framework 버전 간의 값입니다.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. 두 결과에서이 수행합니다.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:

  • 해시 코드 값을 serialize 하거나 데이터베이스에 저장 하지 마십시오.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.
  • 두 개체가 같은지 여부를 확인 하려면 해시 코드의 같은지 테스트 하지 마십시오.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 동일한 해시 코드입니다.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. 경우 재정의 된 Equals 메서드가 반환 true 재정의 된 같음에 대 한 두 개체는 테스트 하는 경우 GetHashCode 메서드는 두 개체에 대해 동일한 값을 반환 해야 합니다.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 (참조 .NET Framework 지원에 대 한 Windows 스토어 앱 및 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. 그러나 가진 것으로 나타납니다 ToString, Equals(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. 해시 함수는 각 형식에 일반적으로 특정 하 고 고유성을 위해 사용 해야 하나 이상의 인스턴스 필드를 입력으로 합니다. 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: -두 개체 같음으로 비교 하는 경우는 GetHashCode() 각 개체에 대 한 메서드는 동일한 값을 반환 해야 합니다. - If two objects compare as equal, the GetHashCode() method for each object must return the same value. 그러나 두 개체를 동일한 것으로 비교 하지 않습니다 하는 경우는 GetHashCode() 두 개체의 메서드를 다른 값을 반환할 필요가 없습니다. 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 합니다. 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() 메서드는 예외를 throw 하지 않아야 합니다. - 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. 따라서 두 String 동일한 문자열 값을 나타내는 경우 개체는 같은 해시 코드를 반환 합니다. Therefore, two String objects return the same hash code if they represent the same string value. 또한 메서드를 사용 하 여 모든 문자 문자열에 입력 특정 범위에 클러스터 된 경우에 무작위 분포 된 출력을 생성 (예를 들어 많은 사용자가 있을 수 있습니다도 낮은 128 ASCII 문자만 포함 하는 문자열을 문자열이 포함할 수 있습니다 65,535 유니코드 문자). 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) 같은 것으로 간주 하는 두 개체가 동일한 해시 코드를 있는지을 보장 하기 위해이 고, 그렇지는 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.

적용 대상

추가 정보