Один формат, несколько рецептов
UUID всегда одной и той же формы: 128 бит, записанные как 32 шестнадцатеричные цифры в привычной группировке 8-4-4-4-12. Между версиями меняется то, как эти биты порождаются. Текущий стандарт, RFC 9562 (опубликован в 2024 году, заменяя долго служивший RFC 4122), определяет версии с 1 по 8, каждая — своя стратегия заполнения 128 бит так, чтобы оставаться уникальным без центрального органа. Обзор UUID сосредоточен на двух, которые вы будете использовать чаще всего, v4 и v7; эта статья картирует всё семейство, чтобы вы могли распознать и выбрать любой из них.
Как UUID объявляет свою версию
Два маленьких поля зарезервированы независимо от версии, и инструмент читает оба. Версия закодирована в четырёх битах (первая шестнадцатеричная цифра третьей группы), так что 4 там означает UUID v4, а 7 означает v7. Вариант закодирован в старших битах следующей группы (первая шестнадцатеричная цифра четвёртой группы обычно 8, 9, a или b для стандартного варианта). Вместе они говорят читателю, как толковать оставшиеся биты, поэтому инструмент может пометить версию UUID, просто осмотрев его, без контекста.
Версии на основе времени: v1, v6, v7
Три версии кодируют метку времени, что делает их примерно упорядоченными по времени, полезное свойство для ключей баз данных (см. статью ключи баз данных):
- Версия 1 сочетает 60-битную метку времени с последовательностью часов и идентификатором узла, где узел традиционно — MAC-адрес машины. Она работает, но утекает MAC и время генерации, и порядок её поля метки времени не сортируется чисто как текст.
- Версия 6 — это v1 с переставленными полями метки времени так, чтобы байты сортировались в хронологическом порядке. Она существует как бесшовное улучшение для систем, уже вложившихся в v1 и желающих сортируемости.
- Версия 7 использует прямолинейную метку времени Unix в миллисекундах, за которой следуют случайные биты. Это современная рекомендация для новых упорядоченных по времени идентификаторов: сортируемая, без утечки оборудования и простая. Для большинства новых работ, желающих упорядоченных ключей, ответ — v7.
Версии на основе имени: v3 и v5
Версии 3 и 5 детерминированы: один и тот же вход всегда порождает один и тот же UUID. Вы хешируете идентификатор пространства имён вместе с именем, и дайджест становится UUID. Версия 3 использует , а версия 5 использует -1; v5 предпочтительнее, потому что SHA-1, хотя здесь и не используется ради безопасности, — менее хрупкий выбор. Это версия, к которой стоит обратиться, когда нужен стабильный идентификатор, выведенный из существующих данных, например согласованный UUID для заданного URL или имени файла, чтобы две системы независимо вычисляли одно и то же значение.
Случайная версия: v4
Версия 4 заполняет 122 бита случайностью (остальные 6 — фиксированные биты версии и варианта). Она не несёт метки времени, ни MAC, ни структуры, что делает её безопасным выбором по умолчанию, когда вам просто нужен непрозрачный, устойчивый к коллизиям идентификатор и порядок неважен. Её единственный недостаток — именно этот недостаток порядка, который вредит локальности индекса базы данных и мотивировал v7. Генерация v4 в инструменте использует криптографически безопасный источник случайности в вашем браузере, так что значения никогда не касаются сервера.
Версия 8 и особые UUID
Версия 8 зарезервирована для пользовательского или экспериментального использования: фиксированы только биты версии и варианта, а остальное определяете вы, что позволяет системе кодировать собственные данные в форме UUID, оставаясь корректным UUID. Есть также два особых значения для распознавания: nil-UUID, все нули, и max-UUID, все единицы, оба используются как сигнальные. Версия 2 существует исторически (вариант DCE Security), но на практике встречается редко и не из тех, что вы выбрали бы сегодня.
Выбор по намерению
Семейство велико, но выбор обычно быстр, как только вы назовёте, что вам нужно. Для непрозрачного, неугадываемого идентификатора без упорядочивания используйте v4. Для стабильного идентификатора, детерминированно выведенного из существующих данных, используйте v5. Для упорядоченного по времени ключа, который хорошо индексируется, используйте v7. Более старые версии на основе времени (v1, v6) важны в основном для совместимости с существующими системами, а v8 — для случая, когда вам действительно нужно закодировать собственную структуру. Когда вы вставляете UUID в инструмент, и он сообщает версию, эта единственная цифра говорит вам, какой из этих рецептов его породил.