Skip to content

문제 7 · 해시 함수 비판

문제 7 [2점]

수정이는 아래와 같은 함수를 이용하면 확률적으로 고른 분포를 보이는 좋은 해시 함수가 되지 않을까 생각했습니다. 이 함수가 해시 함수hash function로서 어떠한지 서술하세요.

h(x)=x×random(0,10)modm

여기서 random(0, 10)은 0과 10 사이의 임의의 실수real number를 생성합니다.

풀이 및 해설

결론부터 말하면 이 함수는 해시 함수로 부적절합니다. 좋은 해시 함수의 핵심 요건을 두 가지나 위반하기 때문입니다.

(1) 결정성 위반 — 가장 치명적

해시 함수는 결정적deterministic이어야 합니다. 즉 같은 키 x는 언제 계산해도 항상 같은 슬롯으로 사상되어야 합니다. 그래야 저장할 때와 조회할 때 같은 위치를 가리켜 값을 찾을 수 있습니다.

그런데 이 함수는 매 호출마다 random(0, 10)이 달라지므로, 같은 키가 매번 다른 슬롯으로 갑니다. 저장한 값을 다시 찾을 수 없어 해시 테이블hash table로서 아예 동작하지 않습니다.

(2) 실수 곱 — 정수 인덱스 보장 안 됨

슬롯 번호(배열 인덱스)는 정수여야 하는데, x × random(0,10)실수입니다. 정수 인덱스로 쓰려면 별도의 버림/반올림이 필요하고, 곱해지는 값이 구간에 따라 편향되면 분포도 균등하지 않게 됩니다.

좋은 해시 함수의 요건

요건의미
결정성deterministic같은 키 → 항상 같은 값
균등성uniformity슬롯에 고르게 분산
효율성efficiency빠르게 계산

"확률적으로 고른 분포"를 노린다며 난수를 넣은 것이 오히려 결정성을 깨뜨려 해시 함수의 가장 기본 요건을 무너뜨렸습니다.

결정성·정수 인덱스 위반 → 해시 함수로 부적절

👉 실습(C++)에서 결정성 위반 확인하기

PDF