Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# Object.GetHashCode() 메서드 완벽 가이드: 문법부터 재정의 예제까지

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 같은 해시 기반 컬렉션에서 올바르게 동작하도록 보장할 수 있습니다.