Skip to content

Feature Uuid time based

github-actions[bot] edited this page Jul 15, 2026 · 1 revision

🕰️ UUID v1/v6 — время и узел

← Возможности · Главная · Сравнение

Классические временные UUID: 60-битная метка Григория (100-нс тики с 1582-10-15), 14-битная тактовая последовательность и 48-битный узел. v6 — та же информация в сортируемой раскладке (старшие биты времени впереди).

Принцип работы

use CloudCastle\Uuid\UuidFactory;

$factory = new UuidFactory(node: '9f6bdeced846', clockSequence: 0x33C8);

$v1 = $factory->uuid1();
$v6 = $factory->uuid6();

$v1->dateTime();          // момент с точностью до микросекунды
$v1->node();              // '9f6bdeced846'
$v1->clockSequence();     // 13256

Узел принимается как 12 hex-символов или 6 сырых байт; без явного узла генерируется случайный с multicast-битом (RFC 9562 §6.10) — случайный узел не выдаёт себя за реальный MAC-адрес.

Монотонность при замороженных часах обеспечивает субтиковый счётчик: каждый вызов в ту же микросекунду продвигает метку на один 100-нс тик. Состояние v1 и v6 общее — их метки не пересекаются.

Плюсы

  • Точность 100 нс — самая высокая среди всех версий.
  • Полная интроспекция: время, узел, последовательность.
  • Диапазон от 1582 года — пригоден для исторических данных.

Минусы

  • v1 несортируем байтово (время задом наперёд) — для индексов берите v6 или v7.
  • Узел и время раскрываются читателю идентификатора.

✅ Рекомендуется

  • Совместимость с legacy-системами, ожидающими v1.
  • v6 — когда нужна сортируемость и микросекундная точность одновременно.

❌ Антипаттерны

  • Реальный MAC-адрес в качестве узла без необходимости — утечка топологии сети.

Схема фичи

flowchart LR
    C[Часы] -->|"тики Григория ×10⁷/с"| F[UuidFactory]
    N["Узел (hex12/байты/случайный+multicast)"] --> F
    S["Тактовая последовательность 14 бит"] --> F
    F --> V1["v1: low-mid-high"]
    F --> V6["v6: high-mid-low (сортируемый)"]
Loading

Жизненный цикл

sequenceDiagram
    participant A as Приложение
    participant F as UuidFactory

    A->>F: uuid1()
    F->>F: тики = мкс × 10 + смещение Григория
    F->>F: тики ≤ прошлых? → прошлые + 1 (субтик)
    F->>F: + узел + последовательность
    F-->>A: Uuid v1 (точность 100 нс)
Loading

Сравнение с аналогами

Возможность Uuid ramsey/uuid symfony/uid 🏆 Победитель
UUID v1 Паритет
UUID v6 Паритет
Явный узел и последовательность ⚠️ Uuid + ramsey/uuid
Multicast-бит случайного узла Паритет
PSR-20 часы ⚠️ Uuid
Даты от 1582 года Паритет

Clone this wiki locally