도구스개발

점프 일관 해시 계산기

키와 버킷 수에서 샤드 번호를 표 없이 정하는 구글의 점프 일관 해시를 계산합니다. 버킷을 하나 늘리면 정확히 1/(n+1)의 키만, 그것도 새 버킷으로만 옮겨 가는 것을 실제로 뿌려 확인할 수 있습니다.

문자열을 FNV-1a로 64비트 값으로 바꿔 씁니다.

샤드 개수입니다. 100만까지 다룹니다.

배정된 버킷

12번

0번부터 15번 중 하나입니다. 반복 5번으로 끝났고, 표도 정렬도 이진탐색도 쓰지 않았습니다.

64비트 키 (FNV-1a)14625641584941013361
버킷 번호12
반복 횟수5번
log₂ n4
쓰는 메모리없음 (상태 0)

버킷 수를 늘려 가면

버킷 수이 키의 배정옮겨졌나
10
20그대로
30그대로
40그대로
50그대로
65새 버킷 5번으로
75그대로
85그대로
95그대로
105그대로
1110새 버킷 10번으로
1211새 버킷 11번으로
1312새 버킷 12번으로
1412그대로
1512그대로
1612그대로
1712그대로
1812그대로
1912그대로
2012그대로

옮겨질 때는 언제나 «새로 생긴 마지막 버킷»으로만 갑니다. 기존 버킷 사이를 오가는 일은 생길 수 없습니다.

key-0부터 순서대로 만들어 뿌립니다.

재배치 비용

16 → 17 로 늘리면5.86% 옮겨짐
이론값 1/(n+1)5.882%
옮겨진 키가 모두 새 버킷으로 갔나그렇습니다
16 → 32 로 두 배 하면50.21% 옮겨짐 (이론 50%)

분포

평균1,250
가장 무거운 버킷1,290
가장 가벼운 버킷1,199
최대 ÷ 평균1.032
표준편차29.76
√평균 (이항분포 어림)35.36
반복 횟수 평균3.38
표를 하나도 들고 있지 않습니다. 링 해시는 가상 노드 수백 개를 정렬해 두고 이진탐색으로 찾지만, 점프 해시는 난수 몇 번이면 끝납니다. 반복 횟수의 기댓값이 O(log n)이라 버킷이 10개든 10만 개든 서너 번에서 예닐곱 번 사이입니다.
옮겨지는 것은 언제나 새 버킷으로만 갑니다. 알고리즘이 «버킷을 1개부터 하나씩 늘려 갈 때 언제 옮겨지는가»를 따라가는 구조라, n에서 n+1로 갈 때 각 키는 확률 1/(n+1)로 새 버킷으로 가고 아니면 그대로 있습니다. 기존 버킷 사이를 오가는 경우가 아예 생길 수 없어 재배치가 언제나 최소입니다.
대신 가운데 버킷을 뺄 수 없습니다. 버킷 번호가 «몇 개째인가»에만 매여 있어 맨 뒤에서만 줄일 수 있습니다. 노드가 임의로 죽고 살아나는 환경에는 맞지 않고, 그런 곳에는 링 해시나 랑데부 해싱을 써야 합니다. 이것이 상태 0을 얻는 대가입니다.
키 자체가 치우쳐 있으면 해시로도 못 고칩니다. 어떤 키가 유난히 자주 온다면 그 키가 배정된 버킷만 무거워집니다. 분포가 고른 것은 «키 종류가 고르게 흩어진다»는 뜻이지 «트래픽이 고르다»는 뜻이 아닙니다.

사용 방법

  1. 1키를 문자열이나 정수로 넣습니다. 문자열은 FNV-1a로 64비트 값을 만들어 씁니다.
  2. 2버킷 수를 넣으면 배정된 버킷 번호와 반복 횟수가 나옵니다.
  3. 3버킷 수를 하나씩 늘려 가며 배정이 언제 바뀌는지 표에서 봅니다.
  4. 4재배치 실험에서 키 수만 개를 뿌려 실제로 옮겨지는 비율을 이론값과 견줍니다.
  5. 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일 · 결과는 참고용 추정치입니다.