А Универсальный уникальный идентификатор (UUID) — это 128-битная метка, используемая в компьютерных системах для уникальной идентификации информации. UUID спроектированы так, чтобы быть уникальными в пространстве и времени, что позволяет генерировать их независимо, без центрального органа, что сводит к минимуму риск дублирования.
UUID служат различным целям, в том числе:
- Идентификация записей в базах данных.
- Тегирование объектов в распределенных системах.
- Служит первичными ключами в приложениях, где уникальность имеет решающее значение.
Реальные примеры использования
-
Базы данных: UUID используется в качестве первичного ключа в реляционных базах данных для обеспечения уникальной идентификации записей.
-
Микросервисы: упростите взаимодействие служб, предоставляя уникальные идентификаторы для запросов и ресурсов.
-
Устройства Интернета вещей: однозначно идентифицируйте устройства в сети, гарантируя, что данные из нескольких источников могут быть агрегированы без конфликтов.
Преимущества и недостатки использования UUID
Преимущества:
-
Глобальная уникальность: конфликты UUID крайне маловероятны, что делает их подходящими для распределенных систем, в которых несколько узлов генерируют идентификаторы независимо.
-
Центральный орган власти не требуется.: их можно создавать без координации, что упрощает операции в распределенных средах.
-
Масштабируемость: они хорошо работают в системах, требующих масштабирования на несколько серверов или служб.
Недостатки:
-
Размер хранилища: UUID занимают больше места (128 бит) по сравнению с традиционными целочисленными идентификаторами (обычно 32 бита), что может привести к увеличению затрат на хранение.
-
Проблемы с производительностью: индексирование UUID может снизить производительность базы данных из-за их случайности и размера, что приводит к увеличению времени выполнения запросов по сравнению с последовательными идентификаторами.
-
Недружелюбие к пользователю: UUID нелегко запомнить или сделать удобным для пользователя, когда они представлены в пользовательских интерфейсах.
Стандарт
Стандартное представление UUID состоит из 32 шестнадцатеричных символов, разделенных на пять групп, разделенных дефисами, в формате 8-4-4-4-12, что в общей сложности составляет 36 символов (32 буквенно-цифровых плюс 4 дефиса). .
Формат UUID можно представить следующим образом:
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Где:
-
M указывает версию UUID.
-
N указывает вариант, который помогает интерпретировать макет UUID.
Компоненты UUID
-
TimeLow: 4 байта (8 шестнадцатеричных символов), представляющие нижнее поле метки времени.
-
TimeMid: 2 байта (4 шестнадцатеричных символа), представляющие среднее поле метки времени.
-
TimeHighAndVersion: 2 байта (4 шестнадцатеричных символа), которые включают номер версии и старшее поле метки времени.
-
ClockSequence: 2 байта (4 шестнадцатеричных символа), используемые для предотвращения коллизий, особенно когда несколько UUID генерируются в быстрой последовательности или если системные часы регулируются.
-
Узел: 6 байтов (12 шестнадцатеричных символов), обычно представляющих MAC-адрес генерирующего узла.
Типы UUID
Версия 1: UUID на основе времени, которые используют комбинацию текущей временной метки и MAC-адреса генерирующего узла. Эта версия обеспечивает уникальность в пространстве и времени.
Версия 2: аналогична версии 1, но включает идентификаторы локального домена; однако он используется реже из-за своих ограничений.
Версия 3: UUID на основе имени, созданные с использованием MD5-хеша идентификатора пространства имен и имени.
Версия 4: UUID, генерируемые случайным образом, которые обеспечивают высокую случайность и уникальность, при этом для управления версиями зарезервировано всего несколько битов.
Версия 5: аналогична версии 3, но для хеширования используется SHA-1, что делает ее более безопасной, чем версия 3.
Варианты
Поле варианта в UUID определяет его расположение и интерпретацию. Наиболее распространенные варианты включают:
-
Вариант 0: зарезервировано для обратной совместимости NCS.
-
Вариант 1: стандартный макет, используемый для большинства UUID.
-
Вариант 2: используется для UUID безопасности DCE, которые встречаются реже.
-
Вариант 3: зарезервировано для будущих определений.
Пример
Для Версии 4 UUID может выглядеть следующим образом:
550e8400-e29b-41d4-a716-446655440000
Здесь:
-
41d4 означает, что это версия 4.
-
a7 представляет вариант, в данном случае обычный вариант «Leach-Salz».
Как рассчитываются UUID
-
Версия 1 (по времени):
- Временная метка обычно представляет собой количество 100-наносекундных интервалов с 15 октября 1582 года (даты реформы григорианского календаря).
- Узел — это MAC-адрес машины, генерирующей UUID.
- Последовательность часов помогает обеспечить уникальность при изменении времени на часах (например, из-за перезагрузки системы).
-
Версия 3 и версия 5 (на основе имени):
- Пространство имен (например, домен DNS) объединяется с именем (например, путем к файлу или URL-адресом) и хэшируется.
- Хеш (MD5 для версии 3, SHA-1 для версии 5) затем структурируется в формат UUID, что обеспечивает правильную настройку полей версии и варианта.
-
Версия 4 (случайная):
- Для 122 бит UUID генерируются случайные или псевдослучайные числа.
- Поля версии и варианта устанавливаются соответствующим образом, обеспечивая соответствие стандартам UUID.
Пример расчета UUIDv4
Шаг 1: сгенерируйте 128 случайных битов
Предположим, мы генерируем следующее 128-битное случайное значение:
110011001101011011010101011110101011101101101110010111010101101101011111011010011011110100100101111001011
Шаг 2: примените версию и вариант UUIDv4
Версия: замените биты 12–15 (4-й символ) на 0100 (для UUID версии 4).
Исходное значение: 1100 становится 0100 → Обновлено значение в этой позиции.
Вариант: Замените биты 6–7 9-го байта на 10 (для варианта RFC 4122).
Исходное значение: 11 становится 10 → Обновлено значение в этой позиции.
Шаг 3: форматирование в шестнадцатеричном формате
Преобразуйте 128-битный двоичный файл в 5 шестнадцатеричных групп:
- 32-битная группа: 11001100110101101101010101111010 → ccda55ba
- 16-битная группа: 1011101101101110 → b76e
- 16-битная группа: 0100010101000101 → 4545 (с 0100 для версии 4)
- 16-битная группа: 1010110111110010 → adf2 (с 10 для варианта)
- 48-битная группа: 11010011011110100100101111001011 → d39d25cb
Шаг 4: Объедините группы
Окончательный UUID будет выглядеть так:
ccda55ba-b76e-4545-adf2-d39d25cb