Skip to content

Feature Nanoid

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

✳️ NanoID

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

Компактные URL-безопасные идентификаторы: 21 символ по умолчанию (сопоставимая с UUID стойкость к коллизиям), произвольные алфавит и длина, несмещённая отбраковочная выборка — как в оригинальном nanoid.

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

use CloudCastle\Uuid\NanoIdFactory;

$factory = new NanoIdFactory();

$factory->generate();                   // 'V1StGXR8_Z5jdHi6B-myT' (21)
$factory->generate(10);                 // короче — для внутренних кодов

$factory->generateWithAlphabet('0123456789abcdef', 32);   // hex-токен
$factory->generateWithAlphabet('23456789ABCDEFGHJKLMNPQRSTUVWXYZ', 8); // купон без похожих

Стандартный алфавит (64 символа) кодируется без отбраковки — ровно 6 бит на символ. Произвольный — несмещённой выборкой: байты вне диапазона отбрасываются, распределение символов строго равномерное (подтверждено security-тестами на полном цикле байтов).

Алфавит валидируется: 2–255 уникальных однобайтовых символов — дубликаты и мультибайт отклоняются с понятной ошибкой.

Плюсы

  • Плотнее UUID: 21 символ против 36 при близкой стойкости.
  • Свой алфавит: коды купонов, человекочитаемые ссылки, числовые PIN.
  • Криптографическая случайность по умолчанию, источник подменяем.

Минусы

  • Нет встроенной метки времени и сортируемости — это строка, не объект-значение.

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

  • Короткие публичные ссылки, коды приглашений, идентификаторы фронтенда.

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

  • Алфавит с похожими символами (0/O, 1/l/I) для кодов, вводимых вручную.
  • NanoID как первичный ключ с сортировкой по времени — берите ULID.

Схема фичи

flowchart LR
    R[RandomSource] --> F[NanoIdFactory]
    F -->|"стандартный алфавит:<br/>байт & 63 — без отбраковки"| S1["21 символ"]
    F -->|"свой алфавит:<br/>маска + отбраковка"| S2["любая длина"]
Loading

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

sequenceDiagram
    participant A as Приложение
    participant F as NanoIdFactory
    participant R as RandomSource

    A->>F: generateWithAlphabet('abcde', 10)
    F->>F: валидация алфавита (уникальность, один байт)
    loop пока не набрано 10 символов
        F->>R: bytes(остаток)
        F->>F: индекс = байт & маска; вне алфавита — отброс
    end
    F-->>A: несмещённый идентификатор
Loading

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

Возможность Uuid hidehalo/nanoid-php 🏆 Победитель
Стандартный NanoID Паритет
Произвольный алфавит Паритет
Несмещённая выборка Паритет
Валидация алфавита Uuid
Скорость генерации 🥇 🥈 Uuid

Clone this wiki locally