반응형
기본 제공되는 함수 '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;
// 항상 같은 값을 가져온다. 하지만 이전 실행과는 다른 값으로 고정되어 있다.
}
프로그램에 변화가 생기는 경우 고유한 값이 달라질 수 있습니다. 한 프로그램 내에서 외부적인 영향이 크게 없는 선에서는(휘발성 메모리로만 사용한다면) 이상 없이 사용할 수 있으나, 프로그램에 변화가 생겨도 일관성있는 값을 얻고 싶다면, 다른 방법으로 구현을 해야합니다.
스크립트
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
반응형
'Utils' 카테고리의 다른 글
NGUI, SafeArea를 통한 아이폰 노치 영역 대응하기 (0) | 2023.03.30 |
---|---|
Unity, 작업 중 Editor가 점점 느려지는 경우 (3) | 2023.03.18 |
Unity, 현재 입력된 KeyCode 가져오기 (0) | 2022.12.28 |
C#, List 랜덤으로 섞기 확장함수 (Shuffle) (1) | 2022.10.24 |
C#, 중복되지 않게 랜덤 숫자 생성 (0) | 2022.08.22 |
댓글