> Как реализовать функцию сокращения URL (Python)
Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы
Компании: Международный аэропорт Шереметьево
Стек: Python
> Пример ответа
Для реализации функции сокращения URL на Python можно использовать генерацию уникального короткого идентификатора на основе хеша или случайной строки. Вот пример простого решения с использованием словаря в памяти (для продакшена нужна БД):
PYTHONimport hashlibimport stringimport randomclass URLShortener:def __init__(self):self.url_map = {} # short_code -> original_urlself.base_url = "https://short.ly/"self.chars = string.ascii_letters + string.digits # 62 символаself.code_length = 6def _generate_code(self, url: str) -> str:"""Генерирует уникальный код на основе хеша URL."""hash_obj = hashlib.md5(url.encode())# Берем первые 6 байт хеша и преобразуем в base62hash_int = int(hash_obj.hexdigest()[:12], 16)code = ""for _ in range(self.code_length):code = self.chars[hash_int % 62] + codehash_int //= 62return codedef shorten(self, url: str) -> str:"""Сокращает URL и возвращает короткую ссылку."""# Проверяем, не сокращали ли уже этот URLfor 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] = urlreturn self.base_url + codedef 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 или реляционную БД с уникальным индексом
> Похожие задачи по Python
Как реализовать сложные триггеры для мониторинга, например отправку SMS при загрузке CPU и низком потреблении памяти
Как проверять корректность работы сервиса и обработку сообщений по разным приоритетам вовремя
Как хранить маппинг между длинным и коротким URL
Как справляться с коллизиями при генерации коротких ссылок
> Похожие задачи по backend
Как реализовать сложные триггеры для мониторинга, например отправку SMS при загрузке CPU и низком потреблении памяти
Как проверять корректность работы сервиса и обработку сообщений по разным приоритетам вовремя
Как хранить маппинг между длинным и коротким URL
Как справляться с коллизиями при генерации коротких ссылок
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью