Консистентное хеширование
Кольцо хешей: ключ у ближайшего сервера; новый узел забирает только свой сектор.
1function hash(x: string, space: number): number {2 let h = 03 for (const ch of x) h = (h * 31 + ch.charCodeAt(0)) >>> 04 return h % space5}6 7function serverFor(key: string, ring: number[]): number {8 const h = hash(key, 360)9 // первый сервер по часовой стрелке от хеша ключа10 const sorted = [...ring].sort((a, b) => a - b)11 for (const s of sorted) if (s >= h) return s12 return sorted[0]!13}Проблема
Кольцо хешей: ключ у ближайшего сервера; новый узел забирает только свой сектор.
Что вы видите
Серверы и ключи на одном круге; стрелка от ключа — к хозяину по часовой.
Как это работает
«hash % N» при изменении N переставляет почти всё; кольцо — только соседний сектор. Кэши, шардинг БД, service discovery.
Пошаговый разбор
- 01
Кольцо
Серверы по хешам на круг 0–360°.
- 02
Ключ
Ближайший по часовой сервер.
- 03
Ресайз
Переезжает только один сектор.
Complexity и ограничения
См. complexity в шапке страницы.
Edge cases
- Пустой вход
Корректно завершается без лишних шагов.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Продукт
Классический приём в реальных системах.
Собеседования
Стандартный вопрос на понимание структуры.
Связанные алгоритмы
«Добавили сервер — и почти ничего не переехало»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.