Перейти к содержимому

Бесплатный генератор UUID - Создавайте V1 и V4 UUID мгновенно

Мгновенно генерируйте уникальные идентификаторы с помощью нашего бесплатного генератора UUID. Создавайте UUID версии 1 (на основе времени) и версии 4 (случайные) для баз данных, API и распределенных систем.

Генератор UUID

Версия UUID
Сгенерированный UUID
Калькулятор загрузки...
📚

Документация

Генератор UUID

Генератор UUID — это инструмент, создающий универсальный уникальный идентификатор, или UUID: код длиной 128 битов, используемый для маркировки фрагмента данных, чтобы никакой другой объект, где бы он ни находился, скорее всего, не имел такой же метки. Эта страница создаёт UUID версии 1 (на основе времени) и версии 4 (случайные).

Что такое UUID?

UUID — это число длиной 128 битов, записанное в виде 32 шестнадцатеричных цифр (символы 0–9 и a–f). Оно разделено дефисами на пять групп по схеме 8-4-4-4-12, всего 36 символов. UUID выглядит, например, так:

1550e8400-e29b-41d4-a716-446655440000
2

UUID определяются стандартом RFC 9562, опубликованным Internet Engineering Task Force в мае 2024 года и заменившим более ранний RFC 4122 от 2005 года. Оба документа описывают один и тот же формат длиной 128 битов. Программное обеспечение использует UUID для идентификации строк баз данных, файлов, пользовательских сеансов и других записей без необходимости централизованной выдачи номеров. Поскольку пространство возможных UUID очень велико, два компьютера могут независимо создать UUID одновременно и почти никогда не получить одинаковый результат.

Формат и структура UUID

128 битов UUID разделены на именованные поля. Каждое поле занимает фиксированное число битов:

  • time_low — 32 бита
  • time_mid — 16 битов
  • time_hi_and_version — 16 битов
  • clock_seq_hi_and_reserved — 8 битов
  • clock_seq_low — 8 битов
  • node — 48 битов
Структура полей UUID time_low time_mid time_hi seq_hi seq_lo node time_low: 32 bits time_mid: 16 bits time_hi_and_version: 16 bits clock_seq_hi_and_reserved: 8 bits clock_seq_low: 8 bits node: 48 bits

Четыре бита внутри поля time_hi_and_version содержат номер версии UUID, а два бита внутри поля clock_seq_hi_and_reserved содержат вариант, который сообщает программному обеспечению, как читать остальные поля. Определены восемь версий.

Приведённые выше имена полей происходят из версии 1, где они действительно содержат значения времени и узла. В других версиях сохраняются та же структура 8-4-4-4-12 и те же границы полей, но большая часть битов заполняется случайными данными. В UUID версии 4 группа с меткой time_low содержит случайное значение, а не время.

Как создать UUID с помощью этого инструмента

  1. Выберите версию: версию 1 (на основе времени) или версию 4 (случайную).
  2. Прочитайте UUID в поле результата. Новый UUID появляется сразу после загрузки страницы или смены версии.
  3. Выберите «Сгенерировать», чтобы создать ещё один UUID.
  4. Выберите «Копировать», чтобы скопировать результат в буфер обмена, а затем вставьте его в код, базу данных или конфигурационный файл.

Панель под результатом разделяет UUID на пять полей и называет каждое из них, поэтому цифры версии и варианта легко найти.

Версия 4 подходит для большинства задач, включая ключи баз данных и маркеры сеансов, поскольку не содержит сведений о времени или месте создания. Версия 1 подходит для записей, в которых время создания должно восстанавливаться по самому идентификатору, например для записей журнала.

Версия UUID 1 и версия 4

Версия 1 кодирует текущую отметку времени, а также случайно выбранные последовательность часов и значение узла. Стандарт допускает использование в качестве значения узла настоящего сетевого адреса компьютера (MAC), но разрешает и случайно сгенерированное значение узла как альтернативу, защищающую конфиденциальность. Этот инструмент всегда использует случайный вариант: его UUID версии 1 никогда не считывают и не раскрывают настоящий MAC-адрес. Стандарт также требует устанавливать младший бит первого байта поля узла в 1 для случайного значения узла; этот инструмент устанавливает его. В настоящих сетевых картах этот бит никогда не установлен, поэтому случайный узел нельзя принять за настоящий. Поэтому в UUID версии 1, созданном на этой странице, вторая шестнадцатеричная цифра пятой группы всегда нечётная: 1, 3, 5, 7, 9, b, d или f.

Отметку времени внутри UUID версии 1 можно прочитать, поэтому записи можно упорядочить по времени создания. Сортировка самого текста UUID этого не обеспечивает, поскольку первая группа содержит младшие 32 бита отметки времени, которые переполняются примерно каждые 7 минут. Версия 6, добавленная в RFC 9562, хранит ту же отметку времени, начиная со старших битов, поэтому работает обычная текстовая сортировка.

Версия 4 строится из случайных битов; несколько битов фиксируются для обозначения версии и варианта. Она не содержит отметки времени и данных, связанных с конкретным компьютером, поэтому не раскрывает, когда и где была создана. Упорядочить её по времени создания нельзя.

В стандарте существуют ещё шесть версий, но этот инструмент их не создаёт: версия 2 (DCE Security, используется редко); версии 3 и 5, создаваемые хешированием пространства имён и имени с помощью MD5 или SHA-1, поэтому одинаковые входные данные всегда дают одинаковый UUID; а также версии 6, 7 и 8, добавленные RFC 9562 в (24 300 см) 2024 году для сортируемых и пользовательских идентификаторов.

Как вычислить UUID (формула)

Версия 4:

  1. Сгенерируйте 128 случайных битов.
  2. Установите четыре бита версии — первую шестнадцатеричную цифру третьей группы — в значение 0100 (шестнадцатеричное 4).
  3. Установите два старших бита четвёртой группы в значение 10 (поэтому первая шестнадцатеричная цифра этой группы равна 8, 9, a или b).

Случайными фактически являются только 122 из 128 битов, поскольку 6 битов фиксируются шагами 2 и 3. Это даёт 2^122, или примерно 5,3 × 10^36, возможных UUID версии 4.

Версия 1:

  1. Возьмите текущее время как количество интервалов по 100 наносекунд с 15 октября 1582 г. — даты реформы григорианского календаря. На практике это обычное время Unix в миллисекундах плюс 12 219 292 800 000, всё умноженное на 10 000.
  2. Разделите это количество длиной 60 битов на три поля: младшие 32 битов поместите в time_low, следующие 16 — в time_mid, а старшие 12 — в time_hi_and_version.
  3. Сгенерируйте последовательность часов длиной 14 битов, используемую для предотвращения совпадений, если системные часы переведены назад.
  4. Сгенерируйте значение узла длиной 48 битов, установив младший бит его первого байта в 1.
  5. Установите биты версии в 0001, а биты варианта — в 10.

Во всех версиях UUID полное пространство длиной 128 битов содержит 2^128, или примерно 3,4 × 10^38, возможных значений. Это настолько большое число, что случайные совпадения на практике не представляют проблемы.

Пример расчёта

Чтение UUID версии 4. Возьмём приведённый ранее пример: 550e8400-e29b-41d4-a716-446655440000.

  • Третья группа, 41d4: первая цифра — 4, обозначающая UUID версии 4.
  • Четвёртая группа, a716: первая цифра, a (двоичное 1010), начинается с 10 — требуемых битов варианта.
  • Остальные шестнадцатеричные цифры являются случайными данными.

Программа, читающая этот UUID, проверяет шаблон 4 и 10, чтобы подтвердить формат, а затем рассматривает остальную часть как непрозрачное случайное значение.

Создание UUID версии 1. Предположим, часы показывают 1 700 000 000 000 миллисекунд времени Unix, то есть 14 ноября 2023 г., 22:13:20 по UTC.

  1. Добавьте смещение: 1 700 000 000 000 + 12 219 292 800 000 = 13 919 292 800 000 мс.
  2. Умножьте на 10 000, чтобы получить интервалы по 100 наносекунд: 139,192,928,000,000,000. В шестнадцатеричной системе это 01EE833B04AFC000.
  3. Разделите это значение: time_low = 04AFC000 (младшие 8 шестнадцатеричных цифр), time_mid = 833B (следующие 4), а старшие 12 битов — 1EE.
  4. Поставьте цифру версии 1 перед 1EE, получив time_hi_and_version = 11EE.

Затем UUID имеет вид 04afc000-833b-11ee-, за которым следуют последовательность часов и значение узла. Программа может выполнить эти четыре шага в обратном порядке и восстановить 14 ноября 2023 г. по идентификатору.

Распространённые применения UUID

  • Первичные ключи в базах данных, особенно когда несколько серверов одновременно создают записи, не обращаясь друг к другу.
  • Маркеры сеансов и ключи API, обычно версии 4 благодаря обеспечиваемой ею конфиденциальности.
  • Идентификаторы файлов, событий и ресурсов в распределённых системах, например в микросервисах.
  • Идентификаторы устройств в крупных сетях Интернета вещей, где каждое устройство может создать собственный идентификатор автономно.

Основной недостаток — размер: UUID занимает 16 байт места для хранения по сравнению с 4 или 8 байтами для простого целочисленного счётчика, а некоторые базы данных индексируют UUID медленнее последовательных целых чисел.

Альтернативы UUID

Автоинкрементные целые числа меньше и проще, но плохо подходят, когда нескольким серверам нужно независимо выдавать идентификаторы. Идентификаторы Snowflake, разработанные в Twitter, объединяют отметку времени с идентификатором рабочего узла и создают компактные сортируемые идентификаторы в распределённой системе. ULID (универсальные уникальные лексикографически сортируемые идентификаторы) — более новый формат, рассчитанный одновременно на случайность и сортировку по времени создания, в отличие от стандартного UUID версии 4.

История стандарта UUID

Концепция UUID возникла в 1980-х годах в компании Apollo Computer как часть её Network Computing System. Позднее Open Software Foundation приняла этот формат для Distributed Computing Environment. Internet Engineering Task Force опубликовала RFC 4122 в (10 500 см) 2005 году, а в мае 2024 года заменила его RFC 9562. RFC 9562 сохраняет неизменную работоспособность всех прежних версий и добавляет версии 6, 7 и 8.

Часто задаваемые вопросы

Для чего используется генератор UUID? Он создаёт уникальные идентификаторы для баз данных, распределённых систем, маркеров сеансов, ключей API и идентификаторов устройств, чтобы двум записям не требовалось иметь один и тот же идентификатор.

В чём разница между UUID v1 и v4? Версия 1 кодирует отметку времени, которую программа может прочитать и использовать для восстановления времени создания. Версия 4 полностью случайна и не содержит отметки времени. Результат версии 1 этого инструмента использует случайно сгенерированное значение узла вместо настоящего MAC-адреса, поэтому также не раскрывает сведения, идентифицирующие компьютер.

Раскрывает ли версия 1 мой MAC-адрес? Не в этом инструменте. Стандарт допускает хранение настоящего MAC-адреса в поле узла UUID версии 1, но этот генератор всегда заполняет поле случайными битами и устанавливает бит, обозначающий, что значение не является настоящим сетевым адресом.

Гарантируется ли уникальность UUID? Ни одна схема идентификаторов не может гарантировать абсолютную уникальность, но пространство длиной 128 битов содержит примерно 3,4 × 10^38 возможных значений, а UUID версии 4 имеет примерно 5,3 × 10^36 возможных случайных значений. Вероятность дубликата достаточно мала, чтобы ею пренебречь почти в любом практическом применении.

Можно ли использовать UUID как первичный ключ базы данных? Да. UUID хорошо подходят для первичных ключей в распределённых системах, поскольку любой узел может создать такой ключ без обращения к центральному серверу. Цена этого решения — 16 байт памяти на ключ, что больше типичного целого числа, а также потенциально более низкая скорость индексирования в очень больших таблицах.

UUID — это то же самое, что GUID? Да. GUID (глобально уникальный идентификатор) — название Microsoft для той же концепции, определённой RFC 4122 как UUID.

Можно ли сортировать UUID версии 4 по времени создания? Нет. UUID версии 4 являются случайными, поэтому не содержат сведений о времени создания. UUID версии 1 содержит такие сведения, но сначала его нужно декодировать; сортировка текста не даёт порядка создания. Версии 6, 7 и ULID предназначены для непосредственной сортировки как текста.

Источники

  1. Davis, K., Peabody, B. и Leach, P. (2024). Universally Unique IDentifiers (UUIDs). RFC 9562. https://www.rfc-editor.org/rfc/rfc9562
  2. Leach, P., Mealling, M. и Salz, R. (2005). A Universally Unique IDentifier (UUID) URN Namespace. RFC 4122. https://www.rfc-editor.org/rfc/rfc4122
  3. Универсальный уникальный идентификатор. В Wikipedia. https://en.wikipedia.org/wiki/Universally_unique_identifier
  4. Идентификатор Snowflake. В Wikipedia. https://en.wikipedia.org/wiki/Snowflake_ID
  5. Спецификация ULID. GitHub. https://github.com/ulid/spec