라빈-카프 롤링 해시 계산기
창을 옮기며 굴림 해시가 어떻게 갱신되는지 한 칸씩 보여 주고, 해시만 맞고 글자는 달랐던 «가짜 일치»가 몇 번 나오는지 셉니다. 모듈러를 바꿔 가며 충돌이 늘어나는 모습을 볼 수 있습니다.
여기에서 찾습니다
모듈러 q
q를 작게 잡을수록 서로 다른 문자열이 같은 해시로 떨어지는 «가짜 일치»가 늘어납니다.
찾은 자리 3곳
0, 31, 48
해시가 맞은 자리가 모두 실제 일치였습니다
해시 대조
창을 옮기며
| 위치 | 창 | 해시 | 판정 |
|---|---|---|---|
| 0 | the | 68 | 일치 |
| 1 | he | 94 | — |
| 2 | e q | 23 | — |
| 3 | qu | 46 | — |
| 4 | qui | 5 | — |
| 5 | uic | 6 | — |
| 6 | ick | 48 | — |
| 7 | ck | 79 | — |
| 8 | k b | 31 | — |
| 9 | br | 41 | — |
| 10 | bro | 44 | — |
| 11 | row | 86 | — |
| 12 | own | 43 | — |
| 13 | wn | 82 | — |
| 14 | n f | 97 | — |
| 15 | fo | 52 | — |
| 16 | fox | 41 | — |
| 17 | ox | 19 | — |
| 18 | x j | 72 | — |
| 19 | ju | 72 | — |
| 20 | jum | 100 | — |
| 21 | ump | 33 | — |
| 22 | mps | 100 | — |
| 23 | ps | 39 | — |
| 24 | s o | 41 | — |
| 25 | ov | 40 | — |
| 26 | ove | 81 | — |
| 27 | ver | 95 | — |
| 28 | er | 27 | — |
| 29 | r t | 59 | — |
| 30 | th | 94 | — |
| 31 | the | 68 | 일치 |
| 32 | he | 94 | — |
| 33 | e l | 18 | — |
| 34 | la | 59 | — |
| 35 | laz | 17 | — |
| 36 | azy | 95 | — |
| 37 | zy | 31 | — |
| 38 | y d | 53 | — |
| 39 | do | 45 | — |
| 40 | dog | 50 | — |
| 41 | og | 10 | — |
| 42 | g a | 82 | — |
| 43 | an | 84 | — |
| 44 | and | 32 | — |
| 45 | nd | 63 | — |
| 46 | d t | 39 | — |
| 47 | th | 94 | — |
| 48 | the | 68 | 일치 |
| 49 | he | 94 | — |
| 50 | e q | 23 | — |
| 51 | qu | 46 | — |
| 52 | qui | 5 | — |
| 53 | uic | 6 | — |
| 54 | ick | 48 | — |
| 55 | ck | 79 | — |
| 56 | k b | 31 | — |
| 57 | br | 41 | — |
| 58 | bro | 44 | — |
| 59 | row | 86 | — |
| 60 | own | 43 | — |
| 61 | wn | 82 | — |
| 62 | n c | 94 | — |
| 63 | ca | 78 | — |
| 64 | cat | 27 | — |
사용 방법
- 1본문과 찾을 문자열을 넣습니다.
- 2모듈러 q를 작은 값부터 큰 값까지 바꿔 가며 «가짜 일치» 횟수가 어떻게 달라지는지 봅니다.
- 3창 표에서 해시가 어떻게 갱신되는지, 어느 자리에서 충돌이 났는지 확인합니다.
자주 묻는 질문
창을 한 칸 옮길 때 해시를 처음부터 다시 계산하지 않고, 빠지는 글자를 빼고 들어오는 글자를 더해 갱신하는 방식입니다. h′ = ((h − s[i]·baseᵐ⁻¹)·base + s[i+m]) mod q 한 줄이면 되므로 창 하나당 O(1)이고 전체가 O(n)이 됩니다. 매번 다시 계산하면 O(nm)이라 단순 대조와 다를 것이 없습니다.
아닙니다. 서로 다른 문자열이 같은 해시로 떨어지는 충돌이 반드시 생깁니다. 그래서 라빈-카프는 해시가 맞은 자리마다 글자를 하나씩 대조해 확인해야 하고, 확인해 보니 아니었던 자리를 «가짜 일치»라고 부릅니다. 이 확인을 건너뛴 구현은 틀린 답을 내놓습니다.
가짜 일치가 급증해 O(n)이라던 것이 O(nm)으로 주저앉습니다. 이 도구의 기본 예문에서 q를 7로 두면 «the»를 찾는 데 가짜 일치가 10번 나지만, 101로 올리면 0번이 됩니다. 실전에서 10⁹ 근처의 큰 소수를 쓰는 이유입니다. 다만 답 자체는 달라지지 않습니다 — 글자 대조로 걸러 내므로 헛수고만 늘어납니다.
라빈-카프는 해시로 «아닌 자리»를 빠르게 건너뛰고, KMP는 패턴 안의 반복 구조를 미리 계산해 두었다가 어긋난 지점에서 되돌아갈 자리를 찾습니다. KMP는 최악의 경우에도 O(n+m)이 보장되지만, 라빈-카프는 충돌이 잦으면 느려질 수 있는 대신 여러 패턴을 한 번에 찾는 데 유리합니다.
됩니다. 글자를 코드 포인트 단위로 세므로 한글은 한 글자, 이모지도 한 글자로 셉니다. UTF-16 코드 단위로 세면 이모지 하나가 두 글자로 잡혀 찾은 위치가 어긋나는데, 그 문제를 피해 두었습니다.
전송되지 않습니다. 계산은 전부 브라우저 안에서 이뤄지고, 입력값은 이 브라우저의 localStorage에만 남습니다.
알아두면 좋은 점
- 해시 계산을 BigInt로 합니다. base와 q가 크면 곱이 2⁵³을 넘어 부동소수점으로는 조용히 어긋나기 때문입니다.
- 중간값이 음수가 될 수 있어 ((x mod q) + q) mod q로 접습니다. 자바스크립트의 %는 음수에 음수를 돌려주므로 이 처리를 빠뜨리면 대부분의 자리에서 해시가 어긋납니다.
- 창 표는 앞의 400개까지만 그립니다. 집계 숫자는 전체를 셉니다.
- 여기서 쓰는 해시는 교육용이라 그대로 보안에 쓰면 안 됩니다. 해시를 알고 있으면 같은 해시를 갖는 문자열을 쉽게 만들어 낼 수 있습니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.