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. Автоінкрементні ID: Прості та зазвичай використовуються в однотабличних системах, але не підходять для розподілених середовищ.

  2. ID на основі часу: Можуть бути корисними для даних, впорядкованих за часом, але можуть стикатися з проблемами зі збігами в сценаріях з високою конкуренцією.

  3. ID Snowflake: Розроблені Twitter, ці ID поєднують часову мітку та номер робочого вузла для генерації унікальних ID у розподілених системах.

  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 Object Identifier. ISO/IEC 9834-8:2005. https://www.iso.org/standard/62795.html
  3. Універсально унікальний ідентифікатор. (2023). У Вікіпедії. https://en.wikipedia.org/wiki/Universally_unique_identifier
  4. ID Snowflake. (2023). У Вікіпедії. https://en.wikipedia.org/wiki/Snowflake_ID
  5. ULID Spec. (н.д.). GitHub. https://github.com/ulid/spec
Feedback