What is GeHashCode()?


  • 해시테이블이나 Dictionary 같은 해시코드를 기반으로 하는 collection에 Key로 활용할 타입을 정의하는 경우를 제외하고는 GetHashCode() 메서드를 재정의하지 않는 것이 좋다.
  • GetHashCode() 메서드를 이용하여 collection들의 해시코드를 획득할 수 있다.
  • Regerence 타입에 대해서는 비효율적이긴 하지만 동작한다.
  • Value타입에 대해서는 제대로 동작하지 않는 경우도 있다. ==> 단, immutable타입에 대해서만 정상적으로 동작한다. 물론 비효율적으로 동작.
  • 해시 기반의 컨테이너들은 검색의 최적화를 위해서 해시 코드를 이용하며 모든 객체는 해시 코드라고 불리는 integer 값을 생성한다.
  • 닷넷에서는 모든 객체들이 해시 코드를 가지고 있으며 이값은 System.Object.GetHashCode()에 의해서 반환된다.
  • GetHashCode()를 재정희하기 위한 3가지 규칙
    1. 만일 두 개의 객체가 동일하다면 두 객체는 동일한 해시 코드를 생성해야 한다. 하지만 해시 코드를 이용하여 특정 컨테이너 내에서 다수의 객체들을 찾아내는 데 사용할 수 없다.
    2. 특정 객체 a에 대해서 a.GetHashCode()의 반환값은 객체의 인스턴스가 생성된 이후에는 변하지 않아야 한다. 어떠한 시점에 a 객체의 GetHashCode()를 호출하더라도 반환되는 값은 항상 동일해야 한다. 해시 기반 컨테이너 내에서는 객체를 찾을 때 해시 코드를 이용하여 저장 공간을 검색하기 때문에 이 값이 변경되면 객체가 저장된 올바른 저장 공간을 찾지 못할 수 있다.
    3. 해시 함수는 모든 입력 값에 대해서 integer의 표현범위 내에서 골고루 잘 분산되어야 한다. 이러한 특성이 해시기반 컨테이너의 수행 성능에 영향을 미친다.
  • 실제로 Object.GetHashCode()는 System.Object 클래스에 존재하는 내부값을 반환하는 역할만 한다.
  • 이 값은 System.Object의 객체 생성자에 의해서 만들어지고 1부터 시작하여 매 객체 생성 요청때마다 1씩 증가되는 값을 생성하도록 구성하여 이 값을 반환할 뿐이다.



http://msdn.microsoft.com/ko-kr/library/system.object.gethashcode.aspx
http://msdn.microsoft.com/ko-kr/library/system.object.aspx

Posted by 사나에