위키득계정 ↗
기술

문자열 해싱

문자열 해싱기술
영어
String hashing
주요 용도
문자열 및 부분 문자열 비교
대표 방식
다항식 해시
핵심 한계
서로 다른 문자열의 해시 충돌 가능
문자열 해싱은 문자열을 일정한 범위의 수로 대응시켜 비교나 검색에 활용하는 기법이다. 같은 규칙에서 같은 문자열은 같은 해시를 갖지만, 해시가 같다는 사실만으로 문자열이 반드시 같다고 결론 내릴 수는 없다.

문자열을 수로 나타내기

문자를 수로 바꾸고 위치에 따라 가중치를 주어 하나의 해시를 계산할 수 있다. 모든 문자를 매번 비교하는 대신 이미 계산한 해시를 비교하면 많은 비교 작업을 줄일 수 있다. 다만 해시를 처음 계산하는 비용이 사라지는 것은 아니며, 같은 문자 인코딩과 계산 규칙을 사용해야 한다.

접두 해시와 구간 계산

한 가지 다항식 방식은 H[0]=0, H[i+1]=(bH[i]+c[i]) mod q로 접두 해시를 저장한다. b는 밑이고 q는 나머지 연산의 기준이다. 이 정의에서는 구간 [l,r)의 해시를 H[r]−H[l]b^(r−l)을 q로 나눈 나머지로 얻는다. 거듭제곱을 미리 저장하면 각 구간의 해시를 일정한 연산 수로 계산한다.

충돌을 이해하는 예

각 문자의 숫자를 단순히 합하는 해시에서는 ab와 ba의 값이 같다. 문자열의 순서는 다른데 같은 값으로 대응된 것이다. 위치를 반영하는 다항식 해시도 유한한 수의 값만 사용하면 일반적으로 충돌을 완전히 피할 수 없다. 해시가 다르면 문자열도 다르지만 역방향은 보장되지 않는다.

비교 결과의 사용

서로 다른 두 해시를 함께 사용하면 적절한 조건에서 충돌 가능성을 낮출 수 있지만 무조건적인 동일성 증명은 아니다. 정확한 확인이 필요하면 원문 비교 등으로 후보를 검증한다. 빠른 문자열 비교를 위한 해시의 성질만으로 비밀번호 저장이나 위변조 방지에 적합한 암호학적 해시라고 판단해서도 안 된다.

관련 문서

해시 함수 / 해시 테이블 / 문자열 / 부분 문자열 / 나머지 연산 / 모듈러 연산 / 시간 복잡도