Lift v1.3.0

UUID та ULID

Lift\Support\Uuid генерує криптографічно безпечні ідентифікатори. Усі формати використовують random_bytes() для своєї випадкової складової.


Формати з одного погляду

Формат Довжина Сортовний Сценарій використання
UUID v4 36 символів Ні Загальне призначення, максимальна сумісність
UUID v7 36 символів Так Первинні ключі БД, розподілені ID, логи
ULID 26 символів Так Людиночитаний, безпечний для URL, компактний

UUID v4 — випадковий

122 біти криптографічної випадковості. Жодної часової складової — максимально непрозорий.

use Lift\Support\Uuid;

$id = Uuid::v4();
// наприклад, "550e8400-e29b-41d4-a716-446655440000"

UUID v7 — упорядкований за часом

Перші 48 бітів кодують Unix-мітку часу з мілісекундною точністю. Наступні значення UUIDv7 сортуються лексикографічно, що робить їх ідеальними для первинних ключів бази даних (дружні до B-дерева, без фрагментації індексу).

$id = Uuid::v7();
// наприклад, "018f8e0d-1c2a-7xxx-xxxx-xxxxxxxxxxxx"
//             ^^^^^^^^ префікс мс-мітки часу

// З конкретною міткою часу (корисно для тестів)
$id = Uuid::v7(ms: 1_718_700_000_000);

Схема бази даних

-- MySQL / MariaDB
CREATE TABLE users (
    id       BINARY(16)   NOT NULL PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID(), 1)),
    -- або зберігати як CHAR(36), якщо BINARY(16) надто незручний
    name     VARCHAR(255) NOT NULL
);

Зберігайте як BINARY(16), використовуючи бінарні помічники:

// Зберегти
$binary = Uuid::toBinary(Uuid::v7());

// Отримати
$uuid = Uuid::fromBinary($row['id']);

ULID — Universally Unique Lexicographically Sortable Identifier

26-символьний рядок Crockford base32. 10-символьний часовий префікс (мс-точність) + 16-символьний випадковий суфікс.

Переваги над UUID:

  • 26 проти 36 символів — компактніший
  • Без дефісів — чистіший в URL, логах і виводі CLI
  • Регістронезалежний
  • Виключає неоднозначні символи (I, L, O, U)
$id = Uuid::ulid();
// наприклад, "01ARZ3NDEKTSV4RRFFQ69G5FAV"

// Конкретна мітка часу
$id = Uuid::ulid(ms: 1_718_700_000_000);

Валідація

Uuid::isValid('550e8400-e29b-41d4-a716-446655440000'); // true
Uuid::isValid('not-a-uuid');                           // false

Uuid::isValidUlid('01ARZ3NDEKTSV4RRFFQ69G5FAV'); // true
Uuid::isValidUlid('INVALID');                     // false

isValid() приймає версії UUID 1–8 (регістронезалежно).


Бінарне кодування

Зберігайте UUID ефективно у стовпці BINARY(16) (половина обсягу сховища від CHAR(36)):

// Під час запису
$binary = Uuid::toBinary($uuid);  // 16 сирих байтів

// Під час читання
$uuid = Uuid::fromBinary($binary);  // назад у "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Вибір правильного формату

Новий проєкт, первинні ключі БД?       → UUID v7  (сортовний, дружній до B-дерева)
URL-слаги, кореляційні ID логів?       → ULID     (компактний, безпечний для URL)
Сумісність з наявними UUID?            → UUID v4