본문 바로가기
Utils

C#, 고정된 해쉬 값 가져오기

by Client. DJ 2023. 3. 18.
반응형

기본 제공되는 함수 'GetHashCode()'

C#에서 지원하는 GetHashCode()가 있습니다. string에서 함수를 호출하면, string이 고유한 인덱스로 변환 처리가 됩니다. 그래서 이를 통해 문자열을 통해서 고유한 인덱스를 얻고 싶을 때 사용할 수 있습니다.

private static void Main(params string[] args)
{
    string text = "NAME";
    int hashId = text.GetHashCode();
    // hashId = 237439930;
    
    hashId = text.GetHashCode();
    // hashId = 237439930;
    
    hashId = text.GetHashCode();
    // hashId = 237439930;
    
    // 항상 같은 값을 가져온다.
}

하지만 항상 같은 값을 주는 것 같지만, 프로그램이 업데이트 되거나, 새로운 환경에서 프로그램을 실행하면 GetHashCode()를 호출하면 다른 값이 나옵니다.

// 프로그램이 업데이트가 됐거나, 새로운 컴퓨터에서 실행이 됐다면..?
private static void Main(params string[] args)
{
    string text = "NAME";
    int hashId = text.GetHashCode();
    // hashId = 169405049;
    
    hashId = text.GetHashCode();
    // hashId = 169405049;
    
    hashId = text.GetHashCode();
    // hashId = 169405049;
    
    // 항상 같은 값을 가져온다. 하지만 이전 실행과는 다른 값으로 고정되어 있다.
}

.Net Document

프로그램에 변화가 생기는 경우 고유한 값이 달라질 수 있습니다. 한 프로그램 내에서 외부적인 영향이 크게 없는 선에서는(휘발성 메모리로만 사용한다면) 이상 없이 사용할 수 있으나, 프로그램에 변화가 생겨도 일관성있는 값을 얻고 싶다면, 다른 방법으로 구현을 해야합니다.

스크립트

public static class Utils
{
    /// <summary>
    /// 문자열에 따른 고정된 Hash 값 가져오기
    /// </summary>
    /// <returns></returns>
    public static int GetFixedHashCode(this string str)
    {
        byte[] hashBytes;
        using (System.Security.Cryptography.SHA256 sha256Hash = System.Security.Cryptography.SHA256.Create())
        {
            hashBytes = sha256Hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(str));
        }
        return BitConverter.ToInt32(hashBytes, 0);
    }
}

SHA256의 알고리즘을 통해 고정된 Hash 값을 가져올 수 있습니다.

예제

private static void Main(params string[] args)
{
    string text = "NAME";
    int hashId = text.GetFixedHashCode();
    // hashId = -348493933;
    
    hashId = text.GetFixedHashCode();
    // hashId = -348493933;
    
    hashId = text.GetFixedHashCode();
    // hashId = -348493933;
    
    // 업데이트가 되어도 항상 같은 값을 가져온다.
}

사용 방법에는 큰 차이가 없지만, 새로이 업데이트가 되어도 같은 값을 가져옵니다.

마무리

개인적으로 프로그램이 업데이트가 되어도 랜덤한 고유한 값을 가져올 수 있는 구현 방식이 필요하여 작성하게 되었습니다. 많은 분들에게 도움이 되었으면 좋겠네요. :)


참고: https://learn.microsoft.com/ko-kr/dotnet/api/system.string.gethashcode?view=net-7.0

반응형

댓글