점프 일관 해시 계산기
키와 버킷 수에서 샤드 번호를 표 없이 정하는 구글의 점프 일관 해시를 계산합니다. 버킷을 하나 늘리면 정확히 1/(n+1)의 키만, 그것도 새 버킷으로만 옮겨 가는 것을 실제로 뿌려 확인할 수 있습니다.
문자열을 FNV-1a로 64비트 값으로 바꿔 씁니다.
샤드 개수입니다. 100만까지 다룹니다.
배정된 버킷
12번
0번부터 15번 중 하나입니다. 반복 5번으로 끝났고, 표도 정렬도 이진탐색도 쓰지 않았습니다.
버킷 수를 늘려 가면
| 버킷 수 | 이 키의 배정 | 옮겨졌나 |
|---|---|---|
| 1 | 0 | — |
| 2 | 0 | 그대로 |
| 3 | 0 | 그대로 |
| 4 | 0 | 그대로 |
| 5 | 0 | 그대로 |
| 6 | 5 | 새 버킷 5번으로 |
| 7 | 5 | 그대로 |
| 8 | 5 | 그대로 |
| 9 | 5 | 그대로 |
| 10 | 5 | 그대로 |
| 11 | 10 | 새 버킷 10번으로 |
| 12 | 11 | 새 버킷 11번으로 |
| 13 | 12 | 새 버킷 12번으로 |
| 14 | 12 | 그대로 |
| 15 | 12 | 그대로 |
| 16 | 12 | 그대로 |
| 17 | 12 | 그대로 |
| 18 | 12 | 그대로 |
| 19 | 12 | 그대로 |
| 20 | 12 | 그대로 |
옮겨질 때는 언제나 «새로 생긴 마지막 버킷»으로만 갑니다. 기존 버킷 사이를 오가는 일은 생길 수 없습니다.
key-0부터 순서대로 만들어 뿌립니다.
재배치 비용
분포
사용 방법
- 1키를 문자열이나 정수로 넣습니다. 문자열은 FNV-1a로 64비트 값을 만들어 씁니다.
- 2버킷 수를 넣으면 배정된 버킷 번호와 반복 횟수가 나옵니다.
- 3버킷 수를 하나씩 늘려 가며 배정이 언제 바뀌는지 표에서 봅니다.
- 4재배치 실험에서 키 수만 개를 뿌려 실제로 옮겨지는 비율을 이론값과 견줍니다.
- 5분포 실험에서 버킷마다 몇 개씩 들어갔는지 확인합니다.
자주 묻는 질문
메모리를 하나도 쓰지 않습니다. 링 해시(consistent hashing)는 가상 노드 수백 개를 정렬해 들고 있다가 이진탐색으로 찾는데, 점프 해시는 난수 몇 번으로 끝나 표도 정렬도 이진탐색도 없습니다. 반복 횟수의 기댓값이 O(log n)이라 버킷이 10개든 10만 개든 서너 번에서 예닐곱 번 사이입니다.
알고리즘이 «버킷을 1개부터 하나씩 늘려 갈 때 언제 옮겨지는가»를 따라가는 구조이기 때문입니다. n에서 n+1로 갈 때 각 키는 확률 1/(n+1)로 새 버킷 n으로 옮겨 가고 아니면 그대로 있습니다. 기존 버킷 사이를 오가는 경우는 아예 생길 수 없어, 재배치가 언제나 최소입니다.
버킷을 맨 뒤에서만 뺄 수 있다는 것이 큰 대가입니다. 가운데 샤드 하나를 빼는 것이 안 됩니다. 링 해시는 아무 노드나 뺄 수 있으므로, 노드가 임의로 죽고 살아나는 환경에서는 링 해시나 랑데부 해싱이 맞습니다. 점프 해시는 «샤드 수를 늘리기만 하는» 경우에 어울립니다.
묻는 것이 다릅니다. 부하 불균형 쪽은 «고르게 뿌려도 가장 무거운 샤드는 평균보다 얼마나 무거운가»를 묻고, 이 계산기는 «어느 샤드로 보낼 것인가, 그리고 샤드를 늘리면 얼마나 옮겨야 하는가»를 묻습니다. 함께 보시면 샤딩 설계의 두 축이 됩니다.
전송되지 않습니다. 모든 계산은 브라우저 안에서만 이뤄지고, 입력값은 이 기기의 저장소에만 남습니다.
알아두면 좋은 점
- 원 논문(Lamping & Veach, 2014)의 LCG 곱수 2862933555777941757을 그대로 씁니다. 자바스크립트에 64비트 정수가 없어 BigInt로 계산합니다.
- 논문 구현은 double로 나눈 뒤 잘라 내는데 이 계산기는 정수로 정확히 나눕니다. 이론상 몫이 정수에 아주 가까울 때만 갈릴 수 있고, 20만 번 대조해 갈리는 경우가 없었습니다.
- 키가 자체적으로 치우쳐 있으면(어떤 키가 유난히 자주 온다면) 해시로도 고칠 수 없습니다. 그 경우에는 키를 더 잘게 쪼개거나 핫키를 따로 다뤄야 합니다.
- 버킷 100만 개까지 다룹니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.