> Как реализовать функцию сокращения URL (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: Международный аэропорт Шереметьево

Стек: Python

> Пример ответа

Для реализации функции сокращения URL на Python можно использовать генерацию уникального короткого идентификатора на основе хеша или случайной строки. Вот пример простого решения с использованием словаря в памяти (для продакшена нужна БД):

PYTHON
import hashlib
import string
import random
class URLShortener:
def __init__(self):
self.url_map = {} # short_code -> original_url
self.base_url = "https://short.ly/"
self.chars = string.ascii_letters + string.digits # 62 символа
self.code_length = 6
def _generate_code(self, url: str) -> str:
"""Генерирует уникальный код на основе хеша URL."""
hash_obj = hashlib.md5(url.encode())
# Берем первые 6 байт хеша и преобразуем в base62
hash_int = int(hash_obj.hexdigest()[:12], 16)
code = ""
for _ in range(self.code_length):
code = self.chars[hash_int % 62] + code
hash_int //= 62
return code
def shorten(self, url: str) -> str:
"""Сокращает URL и возвращает короткую ссылку."""
# Проверяем, не сокращали ли уже этот URL
for short_code, original_url in self.url_map.items():
if original_url == url:
return self.base_url + short_code
# Генерируем новый код
code = self._generate_code(url)
# Обработка коллизий (маловероятно, но на всякий случай)
while code in self.url_map:
code = ''.join(random.choices(self.chars, k=self.code_length))
self.url_map[code] = url
return self.base_url + code
def resolve(self, short_url: str) -> str:
"""Возвращает оригинальный URL по короткой ссылке."""
code = short_url.replace(self.base_url, "")
return self.url_map.get(code, None)
# Пример использования
shortener = URLShortener()
original = "https://example.com/very/long/url/with/parameters"
short = shortener.shorten(original)
print(f"Сокращенный URL: {short}")
resolved = shortener.resolve(short)
print(f"Исходный URL: {resolved}")

Ключевые моменты:

  • Используется MD5-хеш для детерминированной генерации кода (одинаковый URL → одинаковый код)
  • Base62-кодирование (буквы + цифры) для компактности
  • Обработка коллизий через случайную генерацию
  • Для масштабирования замените словарь на Redis или реляционную БД с уникальным индексом

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью