Object.GetHashCode 메서드

정의

기본 해시 함수로 작동합니다.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

다음 예제에서는이 이동 후 줄 바꿈 메서드를 사용 하 여 이전 예제에서 사용 된 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.

참고

해시 테이블에서 해시 코드를 사용 하는 방법 및 몇 가지 추가 해시 코드 알고리즘에 대 한 자세한 내용은 위키백과의 해시 함수 항목을 참조 하세요.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은 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. 두 결과에서이 수행합니다.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의 유용한 구현을 제공 하지 않는 경우 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 Runtime에 대 한 참고 사항Notes for the Windows 런타임Windows Runtime

Windows 런타임Windows Runtime의 클래스에서 GetHashCode 메서드를 호출 하는 경우 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 스토어 앱 및 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. 그러나 C# 또는 Visual Basic 코드에서 사용 하는 경우 ToString, Equals(Object)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.

참고

C# 또는 Visual Basic 작성 된 Windows 런타임Windows Runtime 클래스는 GetHashCode 메서드를 재정의할 수 있습니다.Windows 런타임Windows Runtime 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.

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: -두 개체가 같은 것으로 비교 되는 경우 각 개체에 대 한 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](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 합니다.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. 예를 들어 String 클래스에서 제공 하는 GetHashCode() 메서드의 구현은 동일한 문자열 값에 대해 동일한 해시 코드를 반환 합니다.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.

적용 대상

추가 정보