http://www.codeproject.com/KB/library/String_To_64bit_Int.aspx
닷넷 프레임웍에는 GetHashCode라는 메서드가 있어 문자열을 32비트 정수로 변환할 수 있습니다.
하지만 이렇게 변환된 정수는 유니크한 값이라는 보장을 하지 못합니다.
이에 대한 대안으로 이 아티클에서는 문자열을 64비트 정수로 변환하는 방법을 설명합니다.
물론 64비트 정수라고 해서 유니크함을 보장하지는 않지만, 중복될 확률은 아주 희박해집니다.
아티클 저자의 실험에 의하면, 천만 번을 수행하였을 때, GetHashCode에서는 4,150 개의 중복이 발생한 반면에 GetInt64HashCode에서는 한 개의 중복도 없었다고 합니다.
(아티클의 댓글에 의하면 1억 번을 수행하여도 중복된 값이 없다고 합니다. 또한 참고로 수행에 걸린 시간은 각각 35 ms와 830 ms로 32비트 정수가 월등히 빨랐습니다.)
그렇다면 이 메서드가 어떤 경우에 필요할까요?
아티클에도 등장하는 예이지만, 아주 긴 URL을 DB 테이블에 저장하고 이 컬럼에 인덱스를 거는 경우를 생각해봅시다.
두 가지가 문제가 될 수 있습니다.
- 인덱스 키의 최대 크기를 초과하는 URL을 저장할 수 없습니다.
- 인덱스 키가 커지면 성능이 나빠질 수 밖에 없습니다.
그래서 이에 대한 대안으로 64비트 정수형 컬럼을 추가하고, URL 컬럼이 아닌 이 컬럼에 인덱스를 거는 것입니다.
그렇다면, 특정 URL에 대한 쿼리가 들어오면 이에 대한 64비트 정수값을 얻어서 인덱스 스캔을 할 수가 있을 것입니다.
물론 상황에 따라 취사선택할 문제이긴 하나 진지하게 검토해볼 만한 가치가 있는 기법이라는 생각이 듭니다.