> Как справляться с коллизиями при генерации коротких ссылок (Python)
Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы
Компании: Международный аэропорт Шереметьево
Стек: Python
> Пример ответа
При коллизиях в генерации коротких ссылок (когда два разных URL дают одинаковый хеш) применяют несколько стратегий.
1. Повторная генерация с модификацией
Самый простой подход - при обнаружении коллизии (например, при вставке в БД с уникальным индексом) изменить входные данные и сгенерировать новый хеш. Например, добавить к исходному URL случайную соль или инкрементальный счётчик:
PYTHONimport hashlibimport base62def generate_short(url, salt=""):hash_input = url + salthash_digest = hashlib.md5(hash_input.encode()).hexdigest()[:6]return base62.encode(int(hash_digest, 16))# При коллизии вызываем generate_short(url, salt=str(counter))
2. Увеличение длины хеша
Если коллизии часты, можно увеличить длину короткого кода (например, с 6 до 8 символов), что экспоненциально расширяет пространство значений.
3. Использование счётчика
Вместо хеширования можно генерировать последовательные идентификаторы (например, из глобального счётчика в Redis) и кодировать их в base62. Коллизии исключены, так как ID уникальны.
4. Проверка перед вставкой
Перед сохранением проверять, не занят ли уже сгенерированный код. Если занят - повторить генерацию с новыми параметрами (например, с другим salt). Это гарантирует уникальность без исключений.
На практике чаще всего комбинируют хеширование с повторной генерацией при коллизии, так как это просто и эффективно для большинства нагрузок.
> Похожие задачи по Python
Как реализовать функцию сокращения URL
Как хранить маппинг между длинным и коротким URL
Как оценить необходимое дисковое пространство для хранения сокращенных ссылок с учетом нагрузки и времени жизни
Какая должна быть длина короткой ссылки, чтобы избежать коллизий при заданной нагрузке и времени жизни
> Похожие задачи по backend
Как реализовать функцию сокращения URL
Как хранить маппинг между длинным и коротким URL
Как оценить необходимое дисковое пространство для хранения сокращенных ссылок с учетом нагрузки и времени жизни
Какая должна быть длина короткой ссылки, чтобы избежать коллизий при заданной нагрузке и времени жизни
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью