C#에서 문자열의 해시코드를 얻으려면 GetHashCode() 메서드를 사용하면 됩니다. 이 메서드는 System.String 클래스에 정의되어 있으며, 문자열의 내용을 기반으로 int 형태의 해시 값을 반환합니다.
해시코드는 주로 Dictionary, HashSet과 같은 해시 기반 컬렉션에서 빠른 검색을 위해 활용됩니다. 동일한 문자열은 항상 동일한 해시코드를 가지며, 서로 다른 문자열은 일반적으로 서로 다른 해시코드를 갖습니다.
예제 1: 서로 다른 문자열의 해시코드 비교
아래 예제에서는 서로 다른 두 문자열의 해시코드를 출력하고 비교합니다.
using System;
public class Demo {
public static void Main(String[] args) {
string str1 = "Akon";
string str2 = "Eminem";
Console.WriteLine("String 1 = "+str1);
Console.WriteLine("HashCode of String 1 = "+str1.GetHashCode());
Console.WriteLine("String 2 = "+str2);
Console.WriteLine("HashCode of String 2 = "+str2.GetHashCode());
Console.WriteLine("String 1 is equal to String 2: {0}", str1.Equals(str2));
}
}위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
출력 결과
String 1 = Akon HashCode of String 1 = 416613838 String 2 = Eminem HashCode of String 2 = 40371907 String 1 is equal to String 2: False
"Akon"과 "Eminem"은 서로 다른 문자열이므로 해시코드도 서로 다르게 반환되며, Equals() 메서드의 비교 결과 역시 False입니다.
예제 2: 동일한 문자열의 해시코드 비교
이번에는 내용이 완전히 같은 두 문자열을 비교해 보겠습니다.
using System;
public class Demo {
public static void Main(String[] args) {
string str1 = "Imagine Dragons";
string str2 = "Imagine Dragons";
Console.WriteLine("String 1 = "+str1);
Console.WriteLine("HashCode of String 1 = "+str1.GetHashCode());
Console.WriteLine("String 2 = "+str2);
Console.WriteLine("HashCode of String 2 = "+str2.GetHashCode());
Console.WriteLine("String 1 is equal to String 2: {0}", str1.Equals(str2));
}
}실행 결과는 다음과 같습니다.
출력 결과
String 1 = Imagine Dragons HashCode of String 1 = -1546868095 String 2 = Imagine Dragons HashCode of String 2 = -1546868095 String 1 is equal to String 2: True
두 문자열의 내용이 동일하므로 같은 해시코드가 반환되었고, Equals() 비교 결과도 True입니다.
주의 사항
해시코드를 사용할 때 몇 가지 유의해야 할 점이 있습니다. 첫째, .NET Core 이후 버전에서는 해시 알고리즘이 프로세스마다 무작위화될 수 있어 프로그램을 실행할 때마다 값이 달라질 수 있습니다. 따라서 해시코드를 파일이나 데이터베이스에 저장하는 등 영속적인 용도로 사용해서는 안 되며, 단일 프로세스 내에서의 비교 목적으로만 활용해야 합니다. 둘째, 서로 다른 문자열이 우연히 같은 해시코드를 가지는 해시 충돌(hash collision)이 발생할 수 있으므로, 해시코드가 같다고 해서 두 문자열이 반드시 동일한 것은 아닙니다. 문자열의 실제 동등성 여부는 반드시 Equals() 또는 == 연산자로 확인해야 합니다.