Whiz Tools

Генератор UUID

Сгенерированный UUID

Структура UUID
Низ времени

Генератор UUID

Введение

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

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

Как работают UUID

Структура UUID

UUID обычно представляется в виде 32 шестнадцатеричных цифр, отображаемых в пяти группах, разделенных дефисами, в формате 8-4-4-4-12, всего 36 символов (32 алфавитно-цифровых символа и 4 дефиса). Например:

550e8400-e29b-41d4-a716-446655440000

128 бит UUID разделены на определенные поля, каждое из которых несет различную информацию в зависимости от версии UUID:

  • 32 бита для поля time_low
  • 16 бит для поля time_mid
  • 16 бит для поля time_hi_and_version
  • 8 бит для поля clock_seq_hi_and_reserved
  • 8 бит для поля clock_seq_low
  • 48 бит для поля node

Вот диаграмма, иллюстрирующая структуру UUID:

A B C D E F A: time_low (32 бита) B: time_mid (16 бит) C: time_hi_and_version (16 бит) D: clock_seq_hi_and_reserved (8 бит) E: clock_seq_low (8 бит) F: node (48 бит)

Версии UUID

Существует несколько версий UUID, каждая из которых имеет свой метод генерации:

  1. Версия 1 (основанная на времени): Использует текущее время и MAC-адрес компьютера.
  2. Версия 2 (безопасность DCE): Похожа на версию 1, но включает локальный идентификатор домена.
  3. Версия 3 (основанная на имени, MD5): Генерируется путем хеширования идентификатора пространства имен и имени.
  4. Версия 4 (случайная): Генерируется с использованием случайного или псевдослучайного числа.
  5. Версия 5 (основанная на имени, SHA-1): Похожа на версию 3, но использует хеширование SHA-1.

Этот инструмент сосредоточен на генерации UUID версии 1 и версии 4.

Формула

Генерация UUID версии 1

UUID версии 1 генерируются с использованием следующих компонентов:

  1. Временная метка: 60-битное значение, представляющее количество 100-наносекундных интервалов с 15 октября 1582 года (дата реформы Григорианского календаря).
  2. Последовательность часов: 14-битное значение, используемое для предотвращения дубликатов в случае, если часы установлены назад.
  3. Узел: 48-битное значение, обычно получаемое из MAC-адреса компьютера.

Формула для генерации UUID версии 1 может быть выражена как:

UUID = (timestamp * 2^64) + (clock_sequence * 2^48) + node

Генерация UUID версии 4

UUID версии 4 генерируются с использованием криптографически стойкого генератора случайных чисел. Формула проста:

UUID = random_128_bit_number

С определенными битами, установленными для указания версии (4) и варианта.

Сценарии использования

UUID имеют множество приложений в различных областях компьютерных наук и программной инженерии:

  1. Ключи баз данных: UUID часто используются в качестве первичных ключей в базах данных, особенно в распределенных системах, где несколько узлов могут одновременно генерировать записи.

  2. Распределенные системы: В крупных распределенных системах UUID помогают уникально идентифицировать ресурсы, транзакции или события на нескольких узлах или в дата-центрах.

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

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

  5. Идентификация устройств IoT: В приложениях Интернета вещей (IoT) UUID могут использоваться для уникальной идентификации отдельных устройств в сети.

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

Хотя UUID широко используются, существуют альтернативные подходы к генерации уникальных идентификаторов:

  1. Автоинкрементные идентификаторы: Простые и часто используемые в системах с одной базой данных, но не подходят для распределенных сред.

  2. Идентификаторы, основанные на времени: Могут быть полезны для временно упорядоченных данных, но могут столкнуться с проблемами коллизий в сценариях с высокой конкурентностью.

  3. Идентификаторы Snowflake: Разработаны Twitter, эти идентификаторы комбинируют временную метку и номер рабочего узла для генерации уникальных идентификаторов в распределенных системах.

  4. ULID (Универсально уникальный лексикографически сортируемый идентификатор): Более недавняя альтернатива, которая стремится быть более удобной для человека и сортируемой, чем UUID.

История

Концепция UUID была впервые представлена в системе сетевых вычислений Apollo и позже стандартизирована Открытым программным обеспечением (OSF) в рамках среды распределенных вычислений (DCE) в 1990-х годах. Первоначальная спецификация была опубликована в 1997 году как ISO/IEC 11578:1996 и позже пересмотрена в 2005 году как часть ISO/IEC 9834-8:2005.

Ключевые вехи в истории UUID:

  • 1980-е: Apollo Computer разрабатывает концепцию UUID для своей системы сетевых вычислений.
  • 1997: Первая спецификация UUID опубликована как ISO/IEC 11578:1996.
  • 2005: Спецификация UUID пересмотрена и опубликована как часть ISO/IEC 9834-8:2005.
  • 2009: RFC 4122 определяет формат UUID и алгоритмы генерации, используемые сегодня.

Со временем UUID стали важным инструментом в распределенных системах и проектировании баз данных, с различными реализациями и адаптациями в разных языках программирования и платформах.

Примеры кода

Вот примеры генерации UUID на различных языках программирования:

import uuid

## Генерация UUID версии 4 (случайный)
random_uuid = uuid.uuid4()
print(f"UUID версии 4: {random_uuid}")

## Генерация UUID версии 1 (основанный на времени)
time_based_uuid = uuid.uuid1()
print(f"UUID версии 1: {time_based_uuid}")
const { v1: uuidv1, v4: uuidv4 } = require('uuid');

// Генерация UUID версии 4 (случайный)
const randomUuid = uuidv4();
console.log(`UUID версии 4: ${randomUuid}`);

// Генерация UUID версии 1 (основанный на времени)
const timeBasedUuid = uuidv1();
console.log(`UUID версии 1: ${timeBasedUuid}`);
import java.util.UUID;

public class UuidGenerator {
    public static void main(String[] args) {
        // Генерация UUID версии 4 (случайный)
        UUID randomUuid = UUID.randomUUID();
        System.out.println("UUID версии 4: " + randomUuid);

        // Генерация UUID версии 1 (основанный на времени)
        UUID timeBasedUuid = UUID.fromString(new com.eaio.uuid.UUID().toString());
        System.out.println("UUID версии 1: " + timeBasedUuid);
    }
}
require 'securerandom'

## Генерация UUID версии 4 (случайный)
random_uuid = SecureRandom.uuid
puts "UUID версии 4: #{random_uuid}"

## В Ruby нет встроенного метода для UUID версии 1
## Вам нужно будет использовать гем, такой как 'uuidtools', для этого
<?php
// Генерация UUID версии 4 (случайный)
$randomUuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
    mt_rand(0, 0xffff), mt_rand(0, 0xffff),
    mt_rand(0, 0xffff),
    mt_rand(0, 0x0fff) | 0x4000,
    mt_rand(0, 0x3fff) | 0x8000,
    mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
);
echo "UUID версии 4: " . $randomUuid . "\n";

// В PHP нет встроенного метода для UUID версии 1
// Вам нужно будет использовать библиотеку, такую как 'ramsey/uuid', для этого
?>

Ссылки

  1. Leach, P., Mealling, M., & Salz, R. (2005). Пространственный уникальный идентификатор (UUID) URN Namespace. RFC 4122. https://tools.ietf.org/html/rfc4122
  2. Международная организация по стандартизации. (2005). Информационные технологии – Процедуры для работы с органами регистрации OSI: Генерация и регистрация универсально уникальных идентификаторов (UUID) и их использование в качестве компонентов идентификаторов объектов ASN.1. ISO/IEC 9834-8:2005. https://www.iso.org/standard/62795.html
  3. Универсальный уникальный идентификатор. (2023). В Википедии. https://en.wikipedia.org/wiki/Universally_unique_identifier
  4. Идентификатор Snowflake. (2023). В Википедии. https://en.wikipedia.org/wiki/Snowflake_ID
  5. Спецификация ULID. (н.д.). GitHub. https://github.com/ulid/spec
Feedback