C#에서 인스턴스의 해시 코드 가져오기
C#에서 특정 인스턴스의 해시 코드를 가져오려면 GetHashCode() 메서드를 사용합니다. 이 메서드는 모든 객체에 기본 정의되어 있으며, 객체를 식별하는 데 활용되는 정수(int) 형태의 해시 값을 반환합니다. 해시 코드는 주로 해시 테이블 기반 컬렉션(예: Dictionary, HashSet)에서 빠른 검색을 위해 사용됩니다.
다음은 이 인스턴스의 해시 코드를 가져오는 예제 코드입니다.
예제 1
using System;
public class Demo {
public static void Main() {
string[] arr = {"tom", "amit", "kevin", "katie"};
Type t1 = arr.GetType();
Type t2 = t1.GetElementType();
Console.WriteLine("Type = "+t2.ToString());
Console.WriteLine("Hash Code = "+t1.GetHashCode());
}
}출력 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
Type = System.String Hash Code = 9144789
위 예제에서는 문자열 배열의 타입 정보를 GetType()으로 얻은 뒤, GetElementType()을 통해 배열 요소의 타입(System.String)을 확인하고, Type 객체에 대해 GetHashCode()를 호출하여 해당 타입 인스턴스의 해시 코드를 출력했습니다.
예제 2
이번에는 열거형(enum) 타입에 대해 해시 코드를 구하는 또 다른 예제를 살펴보겠습니다.
using System;
public class Demo {
enum Vehicle {Car, Bus, Bike, Airplane}
public static void Main() {
try {
Vehicle v = Vehicle.Bike;
Type type = v.GetType();
Console.WriteLine("Hash code = "+type.GetHashCode());
string[] str = type.GetEnumNames();
Console.WriteLine("GetEnumName() to return the constant name = " + str);
Type type2 = type.GetEnumUnderlyingType();
Console.Write("Enum Underlying type = "+type2);
Array arrObj = type.GetEnumValues();
Console.Write("Values = "+arrObj);
Console.WriteLine("\nListing constants ..");
for (int i = 0; i < str.Length; i++)
Console.Write("{0} ", str[i]);
}
catch (ArgumentException e) {
Console.WriteLine("Not an enum!");
Console.Write("{0}", e.GetType(), e.Message);
}
}
}출력 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
Hash code = 44757566 GetEnumName() to return the constant name = System.String[] Enum Underlying type = System.Int32Values = Demo+Vehicle[] Listing constants .. Car Bus Bike Airplane
이 예제에서는 열거형 값 Vehicle.Bike에 대해 GetType()을 호출하여 타입 정보를 얻고, GetHashCode()로 해시 코드를 출력했습니다. 또한 GetEnumNames(), GetEnumUnderlyingType(), GetEnumValues() 등의 메서드를 함께 사용하여 열거형 상수 이름 목록, 내부 기반 타입(System.Int32), 그리고 전체 상수 값들을 확인할 수 있었습니다.
정리
GetHashCode()는 객체마다 고유한 정수 해시 값을 반환하며, 동일한 인스턴스에 대해 항상 같은 값을 반환해야 합니다. 단, 해시 코드 값 자체는 애플리케이션 실행 시점이나 .NET 런타임 버전에 따라 달라질 수 있으므로, 영속적인 식별자로 저장하거나 사용해서는 안 됩니다.