문서를 영문으로 보려면 영문 확인란을 선택하세요. 마우스 포인터를 텍스트 위로 이동시켜 팝업 창에서 영문 텍스트를 표시할 수도 있습니다.
번역
영문
이 설명서는 보관되지만 유지 되지 않습니다.

Object.GetHashCode 메서드

특정 형식에 대한 해시 함수 역할을 합니다.

네임스페이스:  System
어셈블리:  mscorlib(mscorlib.dll)

public virtual int GetHashCode()

반환 값

형식: System.Int32
현재 Object의 해시 코드입니다.

해시 코드는 같음 테스트 동안 개체를 식별하는 데 사용되는 숫자 값입니다. 컬렉션에 있는 개체에 대한 인덱스로 사용될 수도 있습니다.

GetHashCode 메서드는 해시 테이블 같은 데이터 구조 및 해시 알고리즘에 적합합니다.

GetHashCode 메서드의 기본 구현에서는 각 개체에 대한 고유한 반환 값을 보장하지 않습니다. 또한 .NET Framework는 GetHashCode 메서드의 기본 구현을 보장하지 않으며 .NET Framework의 버전이 달라도 동일한 값을 반환합니다. 따라서 이 메서드의 기본 구현을 해시 목적의 고유한 개체 식별자로 사용하면 안 됩니다.

GetHashCode 메서드는 파생 형식으로 재정의할 수 있습니다. 값 형식은 해당 형식에 적합한 해시 함수를 제공하고 해시 테이블에 유용한 배포를 제공하도록 이 메서드를 재정의해야 합니다. 최상의 결과를 얻으려면 해시 코드가 정적 필드나 속성 대신 인스턴스 필드나 속성의 값을 기반으로 해야 합니다.

Hashtable 개체에서 키로 사용되는 개체는 자체 해시 코드를 생성해야 하므로 GetHashCode 메서드도 재정의해야 합니다. 키로 사용되는 개체가 GetHashCode의 유용한 구현을 제공하지 않을 경우 Hashtable 개체를 생성할 때 해시 코드 공급자를 지정할 수 있습니다. .NET Framework 버전 2.0 이전에는 해시 코드 공급자가 System.Collections.IHashCodeProvider 인터페이스를 기반으로 했습니다. 버전 2.0부터 해시 코드 공급자는 System.Collections.IEqualityComparer 인터페이스를 기반으로 합니다.

구현자 참고 사항

해시 함수는 개체의 값에 해당하는 숫자(해시 코드)를 빠르게 생성하기 위해 사용됩니다. 일반적으로 해시 함수는 각 Type에 대해 지정되며 고유성을 위해 인스턴스 필드 중 적어도 하나가 입력되어야 합니다.

해시 함수는 다음 속성을 가져야 합니다.

  • 두 개체가 같다고 비교되면 각 개체에 대한 GetHashCode 메서드에서 동일한 값을 반환해야 합니다. 그러나 두 개체가 같지 않다고 해서 두 개체에 대해 GetHashCode 메서드가 서로 다른 값을 반환해야 하는 것은 아닙니다.

  • 개체의 Equals 메서드 반환 값을 결정하는 개체 상태를 수정하지 않으면 해당 개체에 대한 GetHashCode 메서드에서 일관성 있게 동일한 해시 코드를 반환해야 합니다. 이는 현재 응용 프로그램 실행에 대해서만 적용되며 응용 프로그램을 다시 실행하면 다른 해시 코드가 반환될 수 있습니다.

  • 최상의 성능을 얻으려면 해시 함수는 모든 입력에 대해 무작위 분포를 생성해야 합니다.

예를 들어 String 클래스가 제공하는 GetHashCode 메서드 구현에서는 동일한 문자열 값에 대해 동일한 해시 코드를 반환합니다. 따라서 두 String 개체가 동일한 문자열 값을 나타내는 경우에는 두 개체에 대해 동일한 해시 코드가 반환됩니다. 또한 이 메서드는 클러스터링된 문자(문자열에 65.535 개의 문자를 사용할 수 있는데도 이보다 적은 128 ASCII 문자를 사용한 경우)가 입력된 경우에는 해당 문자열의 모든 문자를 사용하여 무작위 분포된 출력을 생성합니다.

Object 의 파생 클래스인 경우, 파생 클래스에서 값 일치를 참조 일치로 정의하고 또한 형식이 값 형식이 아닌 경우에만 GetHashCode 메서드를 Object.GetHashCode 구현에 위임할 수 있습니다.

적절한 해시 함수를 클래스에서 사용하면 개체를 해시 테이블에 추가했을 때의 성능을 향상시킬 수 있습니다. 잘 구현된 해시 함수가 들어 있는 해시 테이블에서는 특정 요소를 검색하는 데 항상 일정한 시간(예: O(1) 연산)이 소요됩니다. 반면, 잘 구현되지 않은 해시 함수가 들어 있는 해시 테이블에서 검색 속도는 해시 테이블에 들어 있는 항목 수에 비례합니다(예: O(n) 연산-여기서 n은 해시 테이블의 항목 수). 해시 함수를 사용하는 데 들어가는 비용도 적어야 합니다.

GetHashCode 메서드의 구현으로 인해 순환 참조가 발생하면 안 됩니다. 예를 들어 ClassA.GetHashCode에서 ClassB.GetHashCode를 호출하면 ClassB.GetHashCode는 직접 또는 간접적으로든 ClassA.GetHashCode를 호출해서는 안 됩니다.

GetHashCode 메서드의 구현에서 예외를 throw하면 안 됩니다.

두 개체가 같을 경우 해당 해시 코드도 같도록 하려면 GetHashCode를 재정의하는 파생 클래스에서 Equals도 재정의해야 합니다. 그렇지 않으면 Hashtable 형식이 제대로 작동하지 않을 수 있습니다.

GetHashCode 메서드는 경우에 따라 단순히 정수 값을 반환하도록 구현됩니다. 다음 코드 예제에서는 정수 값을 반환하는 GetHashCode 구현을 보여 줍니다.

해시 테이블에 더 나은 성능을 제공할 수 있는 해시 코드를 조합하는 더 복잡한 다른 방법이 있습니다.


using System;

public struct Int32 {
   public int value;

   //other methods...

   public override int GetHashCode() {
      return value;
   }
}


일반적으로 형식에는 해시 코드를 생성하는 데 사용될 수 있는 여러 데이터 필드가 있습니다. 해시 코드를 생성할 수 있는 방법 중 하나는 다음 코드 예제에서와 같이 XOR (eXclusive OR) 연산을 통해 이들 필드를 조합하는 것입니다.


using System;

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

   //other methods

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


다음 코드 예제에서는 XOR (eXclusive OR) 연산을 통해 형식의 필드를 조합하여 해시 코드를 생성하는 다른 방법을 보여 줍니다. 코드 예제에서 볼 수 있듯이 각 필드는 GetHashCodeEquals를 구현하는 사용자 정의된 형식을 나타냅니다.


using System;

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

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

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

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

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


파생 클래스의 데이터 멤버가 Int32보다 크면, 다음 코드 예제에서와 같이 XOR (eXclusive OR) 연산을 사용하여 값의 상위 비트와 하위 비트를 조합할 수 있습니다.


using System;

public struct Int64 {
   public long value;

   //other methods...

   public override int GetHashCode() {
      return ((int)value ^ (int)(value >> 32));
   }
}


.NET Framework

4, 3.5, 3.0, 2.0, 1.1, 1.0에서 지원

.NET Framework Client Profile

4, 3.5 SP1에서 지원

에서 지원

Windows 7, Windows Vista SP1 이상, Windows XP SP3, Windows XP SP2 x64 버전, Windows Server 2008(Server Core는 지원되지 않음), Windows Server 2008 R2(Server Core는 SP1 이상에서 지원됨), Windows Server 2003 SP2

.NET Framework에서 모든 플랫폼의 전체 버전을 지원하지는 않습니다. 지원되는 버전의 목록을 보려면 .NET Framework 시스템 요구 사항을 참조하십시오.
표시: