-
-
Notifications
You must be signed in to change notification settings - Fork 0
Feature 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["любая длина"]
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: несмещённый идентификатор
| Возможность | Uuid | hidehalo/nanoid-php | 🏆 Победитель |
|---|---|---|---|
| Стандартный NanoID | ✅ | ✅ | Паритет |
| Произвольный алфавит | ✅ | ✅ | Паритет |
| Несмещённая выборка | ✅ | ✅ | Паритет |
| Валидация алфавита | ✅ | ❌ | Uuid |
| Скорость генерации | 🥇 | 🥈 | Uuid |
CloudCastle Uuid · · PHP 8.1+
GitHub · Packagist · Releases · Discussions · Issues
Email · Telegram · VK · Сетка · 💜 Поддержать проект
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)