Skip to content

Feature Uuid ulid bridge

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

🌉 Мост UUID ↔ ULID

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

UUID и ULID — два прочтения одних и тех же 16 байт. Пакет конвертирует их друг в друга без перекодирования: просто отдаёт байты второму типу.

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

use CloudCastle\Uuid\Uuid;
use CloudCastle\Uuid\Ulid;

$uuid = Uuid::uuid7();
$ulid = $uuid->toUlid();             // тот же момент, та же случайность

$ulid->toUuid()->equals($uuid);      // круговая конверсия без потерь? — байты равны
$uuid->toBase32() === $ulid->toString();   // true: одна форма

// сквозное сравнение между типами — по байтам
$uuid->compareTo($ulid);             // 0

UUID v7 и ULID структурно совместимы: 48 бит миллисекунд в старших байтах — timestampMs() совпадает у обеих форм.

Плюсы

  • В БД — BINARY(16) как UUID, в URL — 26 символов ULID: одно значение, две формы.
  • Конверсия O(1): никакой математики, только передача байтов.
  • Интеграция систем «UUID-мира» и «ULID-мира» без таблиц соответствия.

Минусы

  • Для UUID v1 «метка времени ULID-прочтения» бессмысленна (раскладка иная) — конвертируйте осмысленно v7/v4.

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

  • API, отдающее ULID наружу при UUID-хранении внутри (или наоборот).

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

  • Хранение обеих форм в двух колонках — достаточно одной BINARY(16).

Схема фичи

flowchart LR
    B[("16 байт")]
    U[Uuid] ---|"toUlid()"| B
    L[Ulid] ---|"toUuid()"| B
    U -->|"toBase32()"| S26["26 символов"]
    L -->|"toString()"| S26
Loading

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

sequenceDiagram
    participant DB as БД (BINARY 16)
    participant A as Приложение
    participant W as Веб (URL)

    DB->>A: 16 байт
    A->>A: Uuid::fromBytes(...)
    A->>W: toUlid()->toString() — короткая ссылка
    W->>A: Ulid::fromString(url)
    A->>DB: toBytes() — те же 16 байт
Loading

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

Возможность Uuid ramsey/uuid symfony/uid robinvdvleuten/ulid 🏆 Победитель
UUID → ULID Uuid + symfony/uid
ULID → UUID Uuid + symfony/uid
Сквозное сравнение типов ⚠️ Uuid

Clone this wiki locally