도구스개발

라빈-카프 롤링 해시 계산기

창을 옮기며 굴림 해시가 어떻게 갱신되는지 한 칸씩 보여 주고, 해시만 맞고 글자는 달랐던 «가짜 일치»가 몇 번 나오는지 셉니다. 모듈러를 바꿔 가며 충돌이 늘어나는 모습을 볼 수 있습니다.

여기에서 찾습니다

모듈러 q

q를 작게 잡을수록 서로 다른 문자열이 같은 해시로 떨어지는 «가짜 일치»가 늘어납니다.

찾은 자리 3곳

0, 31, 48

해시가 맞은 자리가 모두 실제 일치였습니다

해시 대조

패턴 해시68
빼는 항의 계수88base^(m−1) mod q
창 개수65
해시가 맞아 대조한 횟수3진짜 3 · 가짜 0
글자를 비교한 횟수9해시 없이 대조하면 71

창을 옮기며

위치해시판정
0the68일치
1he 94
2e q23
3 qu46
4qui5
5uic6
6ick48
7ck 79
8k b31
9 br41
10bro44
11row86
12own43
13wn 82
14n f97
15 fo52
16fox41
17ox 19
18x j72
19 ju72
20jum100
21ump33
22mps100
23ps 39
24s o41
25 ov40
26ove81
27ver95
28er 27
29r t59
30 th94
31the68일치
32he 94
33e l18
34 la59
35laz17
36azy95
37zy 31
38y d53
39 do45
40dog50
41og 10
42g a82
43 an84
44and32
45nd 63
46d t39
47 th94
48the68일치
49he 94
50e q23
51 qu46
52qui5
53uic6
54ick48
55ck 79
56k b31
57 br41
58bro44
59row86
60own43
61wn 82
62n c94
63 ca78
64cat27
해시가 같다고 문자열이 같은 것은 아닙니다. 라빈-카프는 해시가 맞은 자리마다 반드시 글자를 하나씩 대조해 확인합니다. 이 확인을 건너뛰면 «가짜 일치»를 답으로 내놓게 됩니다. 모듈러를 작게 바꿔 가며 그 횟수가 어떻게 늘어나는지 보세요.

사용 방법

  1. 1본문과 찾을 문자열을 넣습니다.
  2. 2모듈러 q를 작은 값부터 큰 값까지 바꿔 가며 «가짜 일치» 횟수가 어떻게 달라지는지 봅니다.
  3. 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일 · 결과는 참고용 추정치입니다.