도구스개발

랑데부 해싱(HRW) 계산기

키마다 모든 노드와 짝지어 해시를 구하고 가장 큰 노드를 고르는 방식으로 키를 배치합니다. 노드를 빼면 그 노드가 맡던 키만 옮겨 가고 나머지는 그대로인 것을 실제로 세어 보여 주며, 가중치와 부하 분포도 함께 냅니다.

«이름» 또는 «이름 가중치» 꼴로 적습니다. 40개까지

노드 하나를 빼면 옮겨 가는 키

25.62%

이론값 1/n = 25% · 남은 노드끼리 오간 키 0개 — 규칙대로입니다 · 키 5,000개를 노드 4개에 배치

노드가중치기대기대 대비
cache-111,28125.62%25%1.025
cache-211,22824.56%25%0.982
cache-311,21224.24%25%0.97
cache-411,27925.58%25%1.023
뺀 노드옮긴 키비율남은 노드끼리
cache-11,28125.62%0
cache-21,22824.56%0
cache-31,21224.24%0
cache-41,27925.58%0

«남은 노드끼리 오간 키»가 0이어야 합니다. 하나라도 0이 아니면 규칙이 깨진 것입니다

노드 수4
가장 큰 노드 / 가장 작은 노드1.0569
노드를 하나 더하면 새 노드로20.04%
그때 기존 노드끼리 오간 키0
이론적인 이동 비율 1/n25%
키 하나당 해시 계산4
1위 (배치)1위 점수2위
user:0cache-46.9735cache-2 5.502
user:1cache-21.7899cache-1 0.588
user:2cache-30.9858cache-2 0.643
user:3cache-23.4719cache-4 1.492
user:4cache-12.0277cache-2 1.248

점수가 가장 큰 노드가 뽑힙니다

계산 근거node(key) = argmax wᵢ / (−ln h(key, nodeᵢ)), h ∈ (0, 1)해시 = murmur3 마무리(FNV-1a("키노드")) / 2³²−ln u가 평균 1인 지수분포를 따르므로 이 점수의 최댓값을 고르면 노드 i가 뽑힐 확률이 정확히 wᵢ/Σw가 됩니다. 가중치가 모두 같으면 그냥 해시가 가장 큰 노드를 고르는 것과 같은 순서입니다.
노드를 빼면 그 노드가 맡던 키만 옮겨 가고 나머지는 그대로입니다. 노드 X를 빼면 각 키의 점수 목록에서 X의 항목 하나가 사라질 뿐이라, X가 1위가 아니었던 키는 1위가 그대로여서 움직이지 않습니다. 위 표의 «남은 노드끼리» 열이 전부 0인 것이 그 증거입니다. 단순히 hash(key) % n으로 나누면 n이 바뀌는 순간 거의 모든 키가 자리를 옮기는데, 그것을 피하려고 나온 방식입니다.
일관된 해싱(해시 링)과 달리 가상 노드가 필요 없습니다. 해시 링은 노드를 원 위에 흩뿌리고 키를 시계 방향 첫 노드에 붙이는데, 노드 수가 적으면 간격이 들쭉날쭉해져 부하가 크게 기웁니다. 그래서 노드 하나를 수백 개의 가상 노드로 쪼개 뿌려야 하고, 그 목록을 어딘가에 들고 있어야 합니다. 랑데부 해싱은 노드 이름 목록만 있으면 어디서 계산해도 같은 답이 나오므로 조정자가 필요 없습니다. 지금 부하의 최대/최소 비가 1.057배입니다.
대신 키 하나를 배치하는 데 노드 수만큼 해시를 계산합니다. 지금은 4번이라 문제가 없지만, 노드가 수천 개가 되면 링을 이진 탐색하는 쪽이 훨씬 빠릅니다. 노드가 수십~수백 개인 캐시 계층이나 샤드 배치가 랑데부 해싱이 잘 맞는 규모입니다.
여기 쓴 해시는 암호학적으로 안전하지 않습니다. FNV-1a에 murmur3의 마무리 함수를 씌운 것이라 분포는 고르지만, 특정 노드로 몰리는 키를 일부러 찾아내는 것을 막지는 못합니다. 공격자가 키 이름을 정할 수 있는 환경이라면 SipHash처럼 비밀 키를 쓰는 해시를 써야 합니다.

사용 방법

  1. 1노드 이름을 한 줄에 하나씩 적습니다. 이름 뒤에 숫자를 적으면 가중치가 됩니다.
  2. 2키 앞머리와 개수를 정하면 «앞머리 + 번호» 꼴의 키를 그만큼 만들어 배치합니다.
  3. 3노드별 부하 표에서 «기대 대비»가 1에 가까운지 봅니다.
  4. 4«노드를 하나씩 빼 보면» 표에서 «남은 노드끼리» 열이 전부 0인 것을 확인합니다.
  5. 5가중치를 2나 5로 바꿔 그 노드의 몫이 그만큼 늘어나는지 봅니다.

자주 묻는 질문

키 하나에 대해 모든 노드와 짝지어 해시를 구하고 값이 가장 큰 노드를 고르는 방식입니다. HRW(Highest Random Weight)라고도 합니다. 링도 가상 노드도 미리 만들어 두는 표도 없이 노드 이름 목록만 있으면 어디서 계산해도 같은 답이 나오므로, 조정자 없이 여러 클라이언트가 같은 배치를 얻을 수 있습니다.

노드 X를 빼면 각 키의 점수 목록에서 X의 항목 하나가 사라질 뿐이기 때문입니다. X가 1위가 아니었던 키는 1위가 그대로여서 움직이지 않고, X가 1위였던 키만 2위로 넘어갑니다. 그래서 노드가 n개일 때 정확히 1/n만 옮겨 가고 남은 노드끼리는 키가 오가지 않습니다. 이 계산기가 실제로 세어 확인해 줍니다.

n이 바뀔 때 옮겨 가는 양이 다릅니다. 나머지 연산은 n이 하나만 바뀌어도 거의 모든 키의 배치가 달라져 캐시 전체가 무효가 됩니다. 랑데부 해싱은 1/n만 옮겨 가고, 그것도 사라진 노드가 맡던 몫뿐입니다.

가상 노드가 필요 없다는 것이 가장 큰 차이입니다. 해시 링은 노드를 원 위에 흩뿌리는데 노드 수가 적으면 간격이 들쭉날쭉해져 부하가 크게 기울므로, 노드 하나를 수백 개의 가상 노드로 쪼개 뿌리고 그 목록을 들고 있어야 합니다. 랑데부 해싱은 그런 장치 없이도 고르게 나뉩니다. 대신 키 하나를 배치하는 데 노드 수만큼 해시를 계산해야 해서, 노드가 수천 개면 링을 이진 탐색하는 쪽이 훨씬 빠릅니다.

점수를 w / (−ln u)로 매깁니다. u는 (0,1) 사이의 해시값이고 −ln u가 평균 1인 지수분포를 따르므로, 이 점수의 최댓값을 고르면 노드 i가 뽑힐 확률이 정확히 wᵢ/Σw가 됩니다. 가중치가 모두 같으면 그냥 해시가 가장 큰 노드를 고르는 것과 같은 순서가 되므로, 한 식으로 두 경우를 모두 다룰 수 있습니다.

노드가 수십에서 수백 개인 경우입니다. 캐시 계층, 샤드 배치, 작업 분배가 대표적입니다. 노드가 수천 개를 넘으면 키마다 그만큼 해시를 계산해야 해서 링 방식이 유리해지고, 노드가 두세 개뿐이면 어느 방식을 써도 차이가 없습니다.

이 계산기는 FNV-1a에 murmur3의 마무리 함수를 씌운 32비트 해시를 씁니다. 분포는 고르지만 암호학적으로 안전하지 않아, 특정 노드로 몰리는 키를 일부러 찾아내는 것을 막지는 못합니다. 공격자가 키 이름을 정할 수 있는 환경이라면 SipHash처럼 비밀 키를 쓰는 해시를 써야 합니다.

전송되지 않습니다. 계산은 모두 브라우저 안에서 이루어지며 적은 노드 이름은 이 기기에만 남습니다.

알아두면 좋은 점

  • 노드는 40개, 키는 20,000개까지 다룹니다. 노드를 하나씩 빼 보는 계산이 키×노드²에 비례해 그보다 크면 브라우저가 느려집니다.
  • 키는 «앞머리 + 번호» 꼴로 만들어 씁니다. 실제 키 목록을 넣어 보려면 앞머리를 실제 키의 모양에 맞춰 두고 개수만 조절하십시오.
  • 부하가 정확히 균등하지는 않습니다. 키가 무작위로 흩어지는 만큼의 통계적 편차가 남으며, 키를 늘릴수록 기대값에 가까워집니다.
  • 여기 쓴 32비트 해시는 암호학적으로 안전하지 않습니다. 실제 시스템에서는 SipHash나 xxHash를 쓰십시오.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 2일 · 결과는 참고용 추정치입니다.