C#의 Object.GetHashCode() 메서드는 모든 객체가 기본적으로 사용하는 해시 함수(default hash function) 역할을 합니다. 이 메서드는 객체를 식별하는 정수형 해시 코드를 반환하며, Hashtable이나 Dictionary처럼 해시 기반 컬렉션에서 빠른 검색 성능을 제공하기 위해 활용됩니다.
문법(Syntax)
public virtual int GetHashCode ();
GetHashCode()는 virtual 메서드이므로, 필요에 따라 파생 클래스에서 재정의(override)하여 자신만의 해시 알고리즘을 구현할 수 있습니다.
주요 특징
- 동일한 객체에 대해서는 항상 같은 해시 코드를 반환해야 합니다.
- 서로 다른 두 객체가 우연히 같은 해시 코드를 가질 수도 있습니다(해시 충돌).
- Equals() 메서드를 재정의할 때는 GetHashCode()도 함께 재정의하는 것이 권장됩니다.
예제 1: 기본 사용법
다음은 Object 타입과 String 타입 객체의 해시 코드를 출력하는 간단한 예제입니다.
using System;
public class Demo {
public static void Main() {
Object ob = new Object();
String str = "Jim";
Type type1 = ob.GetType();
Type type2 = str.GetType();
Console.WriteLine("Hash Code = "+type1.GetHashCode());
Console.WriteLine("Hash Code = "+type2.GetHashCode());
}
}출력 결과
Hash Code = 30015890 Hash Code = 21083178
참고로 실행할 때마다 해시 코드 값은 달라질 수 있습니다. 해시 코드의 일관성은 하나의 프로세스(애플리케이션 도메인) 내에서만 보장되기 때문입니다.
예제 2: GetHashCode() 재정의하기
사용자 정의 구조체에서 GetHashCode()를 재정의하면 필드 값을 기반으로 의미 있는 해시 코드를 생성할 수 있습니다. 아래 예제에서는 세 개의 int 필드를 Tuple로 묶어 해시 코드를 계산합니다.
using System;
public struct Value {
private int v1;
private int v2;
private int v3;
public Value(int v1, int v2, int v3) {
this.v1 = v1;
this.v2 = v2;
this.v3 = v3;
}
public override int GetHashCode() {
return Tuple.Create(v1, v2, v3).GetHashCode();
}
}
public class Demo {
public static void Main() {
Value v = new Value(1, 7, 12);
Console.WriteLine(v.GetHashCode());
v = new Value(12, 8, 7);
Console.WriteLine(v.GetHashCode());
v = new Value(8, 7, 12);
Console.WriteLine(v.GetHashCode());
}
}출력 결과
1258 12803 8931
정리
Object.GetHashCode()는 객체의 해시 코드를 반환하는 기본 해시 함수입니다. 값이 같은 객체라면 동일한 해시 코드를 반환하도록 적절히 재정의하면, Dictionary나 HashSet 같은 해시 기반 컬렉션에서 올바르게 동작하도록 보장할 수 있습니다.