Rabin-Karp에서 해시가 같은 두 윈도우를 발견했을 때 바로 match로 반환하면 안 되는 이유는 무엇인가요?
잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?
답변과 점검 포인트 펼치기답변 접기
구두 답변
정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.
rolling hash는 길이 K인 원문을 하나의 유한한 숫자로 압축하므로 서로 다른 윈도우도 같은 값을 낼 수 있습니다. 따라서 패턴 hash와 텍스트 윈도우 hash가 같다는 것은 값싼 후보 판정이지 문자열 동일성의 증명이 아닙니다. 예를 들어 선택한 modulus에서 hash(ab)=hash(ba)가 될 수 있는데, 패턴이 ab이고 텍스트의 현재 윈도우가 ba라면 hash만 보고 즉시 match를 반환하는 구현은 거짓 양성을 냅니다. 정확한 검색은 후보 위치에서 K개의 문자 또는 canonical bytes를 다시 비교해 충돌을 제거합니다.
후보 생성은 prefix hash로 [i,i+K)를 계산하거나 fixed-window 식으로 갱신합니다. 이 산술은 긴 텍스트를 매 위치에서 처음부터 읽지 않게 해 주지만, 마지막 equality 검사를 없애지는 않습니다. 비적대적 입력에서는 실제 후보 수가 적어 재비교 비용이 작을 수 있지만, 특정 modulus를 노린 입력이나 반복 문자열에서는 후보가 많아져 최악에 가까운 O((n-K+1)K) 검증 비용이 발생할 수 있습니다. 결과가 보안 승인이나 무결성 판정이면 일반 rolling hash를 단독 증거로 사용하지 않고, 결정적 비교 또는 MAC·서명 같은 별도 구조를 둡니다.
double hash는 두 fingerprint가 모두 같은 창만 후보로 만들어 우연한 충돌을 줄일 수 있지만, 원문 비교를 요구하지 않는다는 의미는 아닙니다. 확률적 오탐을 허용하는 필터인지 exact 검색인지 먼저 계약하고, 빈 패턴·K>n·정규화된 입력의 비교 단위를 테스트해야 합니다.
검증 루프는 hash가 같은 위치에서 text[i:i+K]와 pattern을 직접 비교한 뒤에만 결과 목록에 넣어야 합니다. hash가 다른 위치는 즉시 버릴 수 있지만, hash가 같은 위치를 곧바로 승인하면 필터가 판정기가 됩니다. K=1에서는 후보 검증이 한 문자지만, K가 길고 반복 텍스트인 경우 같은 접두를 여러 번 읽을 수 있습니다. 이 비용을 줄이려면 정확한 단일 패턴 검색에는 KMP, 고정 텍스트 다중 질의에는 suffix array 같은 구조가 더 예측 가능한 선택입니다.
득점 포인트
이해가 드러나는 지점을 확인해 보세요.
- hash equality와 string equality를 후보·확정으로 분리합니다.
ab와ba충돌에서 실제 문자 검증이 false positive를 제거하는 흐름을 보여 줍니다.- prefix hash와 rolling 갱신을 후보 생성 비용 절감으로 설명합니다.
- 후보가 많을 때 원문 재비교 비용이 커지는 실패 조건을 말합니다.
- double hash가 위험을 낮춰도 결정적 증명은 아니라는 점을 구분합니다.
감점 포인트
놓치기 쉬운 조건과 오해를 짚어 보세요.
- modulus가 크면 충돌이 불가능하다고 단정합니다.
- hash가 같을 때 원문 검증을 생략해 exact match를 반환합니다.
- rolling hash를 인증·무결성 수단으로 포장합니다.
- 오래된 문자 항을 제거하지 않은 윈도우를 비교합니다.
- 해시 테이블 bucket 충돌과 문자열 window 검증을 같은 단계라고 설명합니다.
더 파고들 거리
하나 더 질문하며 이해의 범위를 넓혀 보세요.
- 원문 후보 검증 없이 결정성을 확보하려면 KMP나 suffix array를 어떤 조건에서 선택할까요?
- 공개 modulus를 아는 공격자와 비적대적 로그를 서로 다른 입력 모델로 문서화하려면 무엇을 적어야 하나요?
득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.