Руководство

Генератор UUID: Полное руководство

UUID (универсально уникальные идентификаторы) — это 128-битные идентификаторы, которые могут генерироваться независимо на любом компьютере и гарантированно уникальны без координации. Они необходимы для распределенных систем, баз данных и API. Это подробное руководство объясняет, как работают UUID, когда использовать различные версии и лучшие практики для реализации.

Что такое UUID?

UUID (универсально уникальный идентификатор) — это 128-битная метка, используемая для уникальной идентификации информации в системах без необходимости центральной координации. UUID форматируются как 32 шестнадцатеричных цифры, отображаемых в пяти группах, разделенных дефисами: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, например "550e8400-e29b-41d4-a716-446655440000". Ключевая идея UUID заключается в том, что пространство возможных значений настолько велико, что случайно сгенерированные ID фактически гарантированно уникальны. С 2^128 возможными значениями (приблизительно 3.4 × 10^38) вы могли бы генерировать миллиард UUID в секунду в течение столетия и иметь ничтожную вероятность коллизии. UUID решают фундаментальную проблему в распределенных системах: как могут несколько компьютеров независимо генерировать уникальные идентификаторы без коммуникации? Традиционные последовательные ID требуют центрального авторитета (как автоинкремент базы данных), который становится узким местом и единой точкой отказа. UUID могут генерироваться где угодно, когда угодно, с уверенностью, что они не будут конфликтовать. Формат UUID стандартизирован в RFC 4122. Пять групп содержат 8, 4, 4, 4 и 12 шестнадцатеричных цифр соответственно, в общей сложности 36 символов (включая дефисы). Формат включает информацию о версии и варианте, кодированную в определенных битах, что мы рассмотрим в сравнении версий. Распространенные применения включают: первичные ключи в базах данных, особенно распределенных базах данных; идентификаторы сеансов в веб-приложениях; идентификаторы отслеживания для API запросов и событий; уникальные имена файлов для загруженного контента; идентификаторы устройств в мобильных приложениях; и ID корреляции для распределенной трассировки. Хотя "UUID" — официальный термин из RFC 4122, Microsoft использует "GUID" (глобально уникальный идентификатор) для той же концепции. Они функционально идентичны; термины взаимозаменяемы.

Версии UUID

Спецификация UUID определяет пять версий, каждая с разными методами генерации и случаями использования. Версия кодируется в битах 12-15 UUID (первая шестнадцатеричная цифра третьей группы). Понимание этих версий помогает вам правильно выбирать для вашего приложения. Версия 1 (основанная на времени): объединяет текущую временную метку (100-наносекундные интервалы с 15 октября 1582 года) с MAC-адресом генерирующего компьютера. UUID V1 гарантированно уникальны и могут быть отсортированы хронологически. Однако они раскрывают, когда и где были сгенерированы, что может быть проблемой конфиденциальности. MAC-адрес раскрывает производителя устройства и может использоваться для отслеживания. Версия 2 (DCE Security): вариант Версии 1, который включает POSIX UID/GID. Редко используется на практике и не широко поддерживается. Версия 3 (основанная на имени MD5): генерируется хешированием UUID пространства имен и имени с использованием MD5. При одинаковом пространстве имен и имени вы всегда получаете один и тот же UUID. Полезно для создания воспроизводимых ID из известных вводов. Однако MD5 криптографически слаб, поэтому Версия 5 предпочтительнее для новых приложений. Версия 4 (случайная): генерируется с использованием случайных или псевдослучайных чисел. Это наиболее часто используемая версия, потому что она проста, не имеет проблем с конфиденциальностью и обеспечивает отличные гарантии уникальности. 122 бита случайны (6 битов используются для версии и варианта), давая 2^122 возможных значений. Наш генератор производит UUID V4. Версия 5 (основанная на имени SHA-1): как Версия 3, но использует SHA-1 вместо MD5. Предпочтительнее V3 для UUID, основанных на именах. Используйте, когда вам нужны детерминированные UUID из известных вводов. Для большинства приложений Версия 4 (случайная) — правильный выбор. Используйте версии, основанные на именах (3 или 5), когда вам нужна воспроизводимость — одинаковые вводы всегда производят один и тот же UUID. Используйте Версию 1 только если вам конкретно нужна сортировка по времени и вы принимаете компромиссы конфиденциальности.

Случаи использования

UUID служат разнообразным целям в разработке программного обеспечения. Понимание этих случаев использования помогает вам эффективно применять UUID и выбирать правильный подход для ваших конкретных потребностей. Первичные ключи базы данных: UUID делают отличные первичные ключи, особенно в распределенных базах данных или системах, которые могут объединять данные из нескольких источников. В отличие от автоинкрементных ID, UUID могут генерироваться на стороне клиента до существования записи, ID не раскрывают информацию о порядке или подсчете, и объединение баз данных не вызывает коллизий ID. Однако UUID больше, чем целые числа (16 байт против 4-8 байт), что влияет на хранение и производительность индекса. Идентификаторы сеансов: UUID идеальны для токенов сеансов, потому что они неугадываемы (в отличие от последовательных ID) и уникальны без проверки базы данных. Пользователь не может вывести другие валидные ID сеансов из своего собственного. Комбинируйте с валидацией на стороне сервера и безопасным хранением. Отслеживание API запросов: включение UUID в каждый API запрос обеспечивает распределенную трассировку через микросервисы. ID запроса распространяется через все вызовы сервисов, позволяя вам коррелировать логи и отлаживать проблемы через границы систем. Инструменты вроде Jaeger и Zipkin используют этот паттерн. Именование файлов и ресурсов: при хранении загруженных файлов UUID имя файла предотвращает коллизии (два пользователя загружают "документ.pdf") и предотвращает атаки перечисления (угадывание валидных имен файлов). Исходное имя файла может храниться как метаданные, в то время как UUID обрабатывает хранение. Уникальные идентификаторы в URL: UUID в URL вроде /products/550e8400-e29b-41d4-a716-446655440000 не раскрывают масштаб ваших данных (сколько продуктов существует) или порядок (какой продукт был создан первым). Это полезно для конфиденциальности и предотвращения скрапинга. Ключи идемпотентности: при выполнении API запросов, которые не должны дублироваться (как платежи), включайте сгенерированный клиентом UUID. Сервер может использовать это для обнаружения и отклонения дублированных запросов, делая операцию идемпотентной. Приложения offline-first: мобильные приложения, работающие оффлайн, могут генерировать UUID для новых записей немедленно. При синхронизации с сервером нет конфликта между различными устройствами, создающими записи одновременно.

Попробовать инструмент

Генератор UUID

Генератор UUID

Узнать больше

Вопросы и ответы

Генератор UUID

Вопросы и ответы