-
-
Notifications
You must be signed in to change notification settings - Fork 0
Comparison
Сравнение CloudCastle Uuid с пятью аналогами: ramsey/uuid, symfony/uid,
robinvdvleuten/ulid, hidehalo/nanoid-php, godruoyi/php-snowflake.
Таблица возможностей генерируется из tools/features-data.php
(composer docs:features), числовые бенчмарки — из composer compare
(composer docs:comparison), уровни качества — из конфигов пакета.
Сгенерировано из tools/features-data.php (факты о поддержке). Легенда: ✅ полностью ·
| Функция | Uuid | ramsey/uuid | symfony/uid | robinvdvleuten/ulid | hidehalo/nanoid-php | godruoyi/php-snowflake | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
| UUID v1 — время Григория + узел | ✅ | ✅ | ✅ | — | — | — | Паритет |
| UUID v2 — DCE Security (домен + локальный ID) | ✅ | ✅ | ❌ | — | — | — | Uuid + ramsey/uuid |
| UUID v3 / v5 — имя в пространстве имён (MD5/SHA-1) | ✅ | ✅ | ✅ | — | — | — | Паритет |
| UUID v4 — случайный | ✅ | ✅ | ✅ | — | — | — | Паритет |
| UUID v6 — переупорядоченное время (сортируемый v1) | ✅ | ✅ | ✅ | — | — | — | Паритет |
| UUID v7 — миллисекунды Unix (сортируемый) | ✅ | ✅ | ✅ | — | — | — | Паритет |
| UUID v8 — пользовательские 122 бита | ✅ | ✅ | ✅ | — | — | — | Паритет |
| Nil и Max UUID | ✅ | ✅ | ✅ | — | — | — | Паритет |
| Монотонность v7 в пределах миллисекунды | ✅ | ✅ | ✅ | — | — | — | Паритет |
| Функция | Uuid | ramsey/uuid | symfony/uid | robinvdvleuten/ulid | hidehalo/nanoid-php | godruoyi/php-snowflake | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
| Каноническая 8-4-4-4-12 | ✅ | ✅ | ✅ | — | — | — | Паритет |
| 16 сырых байт (BINARY-хранение) | ✅ | ✅ | ✅ | — | — | — | Паритет |
| Hex-строка (32 символа) | ✅ | ✅ | ✅ | — | — | — | Паритет |
| Base58 (22 символа) | ✅ | ❌ | ✅ | — | — | — | Uuid + symfony/uid |
| Base32/Crockford — форма ULID (26 символов) | ✅ | ❌ | ✅ | — | — | — | Uuid + symfony/uid |
| URN «urn:uuid:…» | ✅ | ✅ | ❌ | — | — | — | Uuid + ramsey/uuid |
| Десятичное 128-битное число | ✅ | ✅ | ❌ | — | — | — | Uuid + ramsey/uuid |
| GUID Microsoft (little-endian поля) | ✅ | ✅ | ❌ | — | — | — | Uuid + ramsey/uuid |
| Фигурная форма «{uuid}» | ✅ | ❌ | — | — | — | Uuid | |
| Умный fromString() — любая форма по длине | ✅ | ❌ | ✅ | — | — | — | Uuid + symfony/uid |
| Интроспекция: версия, вариант, метка, узел, последовательность | ✅ | ✅ | — | — | — | Uuid + ramsey/uuid |
| Функция | Uuid | ramsey/uuid | symfony/uid | robinvdvleuten/ulid | hidehalo/nanoid-php | godruoyi/php-snowflake | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
| Генерация ULID | ✅ | — | ✅ | ✅ | — | — | Паритет |
| Монотонный режим в пределах миллисекунды | ✅ | — | ✅ | ❌ | — | — | Uuid + symfony/uid |
| Бинарная форма 16 байт | ✅ | — | ✅ | ❌ | — | — | Uuid + symfony/uid |
| Метка времени из ULID | ✅ | — | ✅ | ✅ | — | — | Паритет |
| Мост ULID ↔ UUID (байты 1:1) | ✅ | — | ✅ | ❌ | — | — | Uuid + symfony/uid |
| Верхний и нижний регистр вывода | ✅ | — | ✅ | — | — | Uuid + robinvdvleuten/ulid | |
| Nil и Max ULID | ✅ | — | ✅ | ❌ | — | — | Uuid + symfony/uid |
| Функция | Uuid | ramsey/uuid | symfony/uid | robinvdvleuten/ulid | hidehalo/nanoid-php | godruoyi/php-snowflake | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
| Генерация NanoID (стандартный алфавит) | ✅ | — | — | — | ✅ | — | Паритет |
| Произвольный алфавит и длина | ✅ | — | — | — | ✅ | — | Паритет |
| Несмещённая отбраковочная выборка | ✅ | — | — | — | ✅ | — | Паритет |
| Валидация алфавита (дубликаты, мультибайт) | ✅ | — | — | — | ❌ | — | Uuid |
| Функция | Uuid | ramsey/uuid | symfony/uid | robinvdvleuten/ulid | hidehalo/nanoid-php | godruoyi/php-snowflake | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
| Snowflake (раскладка Twitter 41/5/5/12) | ✅ | — | — | — | — | ✅ | Паритет |
| Sonyflake (раскладка Sony 39/8/16) | ✅ | — | — | — | — | ✅ | Паритет |
| Разбор идентификатора на поля | ✅ | — | — | — | — | ✅ | Паритет |
| Настраиваемая эпоха | ✅ | — | — | — | — | ✅ | Паритет |
| Обнаружение отката часов без ожидания | ✅ | — | — | — | — | Uuid | |
| Перенос при переполнении последовательности без сна | ✅ | — | — | — | — | Uuid |
| Функция | Uuid | ramsey/uuid | symfony/uid | robinvdvleuten/ulid | hidehalo/nanoid-php | godruoyi/php-snowflake | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
| PSR-20 часы во всех временных генераторах | ✅ | ❌ | ❌ | — | Uuid | ||
| Подменяемый источник случайности | ✅ | ✅ | ❌ | ❌ | ✅ | Uuid + ramsey/uuid + hidehalo/nanoid-php | |
| Полный детерминизм в тестах (время + случайность) | ✅ | ❌ | ❌ | Uuid | |||
| Явный момент генерации (в прошлом/будущем) | ✅ | ✅ | ✅ | ✅ | — | ❌ | Uuid + ramsey/uuid + symfony/uid + robinvdvleuten/ulid |
| Единый контракт идентификаторов + сквозное сравнение | ✅ | ❌ | ❌ | ❌ | ❌ | Uuid | |
| Экранирование управляющих символов в ошибках | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | Uuid |
| Функция | Uuid | ramsey/uuid | symfony/uid | robinvdvleuten/ulid | hidehalo/nanoid-php | godruoyi/php-snowflake | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
| Одна runtime-зависимость (psr/clock — только интерфейс) | ✅ | ❌ | ✅ | ✅ | ✅ | Uuid + robinvdvleuten/ulid + hidehalo/nanoid-php + godruoyi/php-snowflake | |
| Без polyfill и брендированных зависимостей | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | Uuid + robinvdvleuten/ulid + hidehalo/nanoid-php + godruoyi/php-snowflake |
| Все пять семейств идентификаторов в одном пакете | ✅ | ❌ | ❌ | ❌ | ❌ | Uuid |
Сгенерировано из конфигов пакета (composer docs:sync). Уровни Uuid — из phpstan.neon / psalm.xml / infection.json.dist / phpmd.xml / deptrac.yaml; по аналогам — заявленный инструментарий из их composer.json (Composer-дистрибутивы аналогов конфигов качества не содержат, поэтому их уровни — «н/д»).
| Контроль качества | Uuid | ramsey/uuid | symfony/uid | robinvdvleuten/ulid | hidehalo/nanoid-php | godruoyi/php-snowflake | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
| PHPStan | ✅ level max + strict-rules | ✅ (уровень: н/д) | ❌ | ❌ | ❌ | ✅ (уровень: н/д) | Uuid (уровень задокументирован) |
| Psalm | ✅ errorLevel 1 | ❌ | ❌ | ❌ | ❌ | ❌ | Uuid |
| Мутационное тестирование (Infection) | ✅ minMSI 98% (факт: 0 выживших) | ❌ | ❌ | ❌ | ❌ | ❌ | Uuid |
| PHPMD | ✅ 10 правил | ❌ | ❌ | ❌ | ❌ | ❌ | Uuid |
| Deptrac (архитектурные слои) | ✅ 5 слоёв | ❌ | ❌ | ❌ | ❌ | ❌ | Uuid |
| Rector (dry-run в CI) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | Uuid |
| Код-стайл (PSR-12: phpcs + cs-fixer) | ✅ | ✅ (уровень: н/д) | ❌ | ❌ | ✅ (уровень: н/д) | ❌ | Uuid (уровень задокументирован) |
| Покрытие строк (порог на файл) | ✅ 98% (факт: 100%) | н/д | н/д | н/д | н/д | н/д | Uuid |
| Конфиги качества в дистрибутиве | ✅ поставляются | ❌ | ❌ | ❌ | ❌ | ❌ | Uuid |
Методика: каждая пара «библиотека × сценарий» выполняется в отдельном php-процессе (память и состояние одной библиотеки не влияют на замеры другой), одинаковый цикл и число итераций у всех, Xdebug выключен, медиана из 7 прогонов.
Сгенерировано из composer compare (PHP 8.1.34). Правки в блоке будут перезаписаны.
| Сценарий | Uuid | ramsey/uuid | symfony/uid | robinvdvleuten/ulid | hidehalo/nanoid-php | godruoyi/php-snowflake | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
| UUID v4: генерация до канонической строки | 1 046 205 ops/s | 610 239 ops/s | 1 018 006 ops/s | — | — | — | Uuid |
| UUID v7: генерация до канонической строки | 371 194 ops/s | 249 140 ops/s | 314 415 ops/s | — | — | — | Uuid |
| UUID v5: имя в пространстве DNS до строки | 1 180 795 ops/s | 169 722 ops/s | 742 033 ops/s | — | — | — | Uuid |
| UUID: разбор канонической строки в объект | 1 881 107 ops/s | 3 495 373 ops/s | 1 542 031 ops/s | — | — | — | ramsey/uuid |
| UUID: сериализация в Base58 | 267 701 ops/s | — | 99 551 ops/s | — | — | — | Uuid |
| UUID: разбор строки до 16 байт (для BINARY-хранения) | 1 827 324 ops/s | 1 986 579 ops/s | 850 262 ops/s | — | — | — | ramsey/uuid |
| ULID: генерация до канонической строки | 344 694 ops/s | — | 326 323 ops/s | 275 941 ops/s | — | — | Uuid |
| ULID: разбор строки в объект | 549 310 ops/s | — | 1 583 402 ops/s | 1 758 765 ops/s | — | — | robinvdvleuten/ulid |
| ULID: генерация до 16 байт (для BINARY-хранения) | 541 988 ops/s | — | 237 421 ops/s | — | — | — | Uuid |
| ULID: порядковое сравнение двух значений | 8 731 642 ops/s | — | 7 952 315 ops/s | — | — | — | Uuid |
| NanoID: генерация 21 символа | 1 413 007 ops/s | — | — | — | 530 293 ops/s | — | Uuid |
| Snowflake: генерация до десятичной строки | 552 896 ops/s | — | — | — | — | 81 348 ops/s | Uuid |
| Snowflake: разбор идентификатора на поля | 3 017 522 ops/s | — | — | — | — | 1 139 132 ops/s | Uuid |
Память — добавленная пиковая память процесса за сценарий (классы библиотеки + объекты + операции), меньше — лучше:
| Сценарий | Uuid | ramsey/uuid | symfony/uid | robinvdvleuten/ulid | hidehalo/nanoid-php | godruoyi/php-snowflake | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
| UUID v4: генерация до канонической строки | 0.0 КБ | 163.7 КБ | 0.0 КБ | — | — | — | Паритет лидеров |
| UUID v7: генерация до канонической строки | 0.0 КБ | 164.5 КБ | 0.0 КБ | — | — | — | Паритет лидеров |
| UUID v5: имя в пространстве DNS до строки | 0.0 КБ | 218.8 КБ | 0.0 КБ | — | — | — | Паритет лидеров |
| UUID: разбор канонической строки в объект | 0.0 КБ | 0.0 КБ | 0.0 КБ | — | — | — | Паритет лидеров |
| UUID: сериализация в Base58 | 0.0 КБ | — | 0.0 КБ | — | — | — | Паритет лидеров |
| UUID: разбор строки до 16 байт (для BINARY-хранения) | 0.0 КБ | 0.0 КБ | 0.0 КБ | — | — | — | Паритет лидеров |
| ULID: генерация до канонической строки | 0.0 КБ | — | 0.0 КБ | 0.0 КБ | — | — | Паритет лидеров |
| ULID: разбор строки в объект | 0.0 КБ | — | 0.0 КБ | 0.0 КБ | — | — | Паритет лидеров |
| ULID: генерация до 16 байт (для BINARY-хранения) | 0.0 КБ | — | 0.0 КБ | — | — | — | Паритет лидеров |
| ULID: порядковое сравнение двух значений | 0.0 КБ | — | 0.0 КБ | — | — | — | Паритет лидеров |
| NanoID: генерация 21 символа | 0.0 КБ | — | — | — | 0.0 КБ | — | Паритет лидеров |
| Snowflake: генерация до десятичной строки | 0.0 КБ | — | — | — | — | 0.0 КБ | Паритет лидеров |
| Snowflake: разбор идентификатора на поля | 0.0 КБ | — | — | — | — | 0.0 КБ | Паритет лидеров |
- Единственный пакет со всеми пятью семействами: UUID 1–8 (включая v2 DCE), ULID, NanoID, Snowflake и Sonyflake — суперсет возможностей пяти библиотек.
- PSR-20 часы и подменяемая случайность во всех генераторах — байт-в-байт воспроизводимая генерация в тестах; аналоги дают это частично или никак.
- Девять форм сериализации UUID: читает и пишет «диалекты» и ramsey (URN, десятичная, GUID), и symfony (Base58, Base32) одновременно.
- Байтовая модель значений:
toBytes()мгновенный, сравнение и мост UUID↔ULID без перекодирования (генерация ULID до 16 байт — +128 % к symfony/uid). - Производительность: лидер в 11 из 13 сценариев (NanoID ×2.7, Snowflake ×6.8, Base58 ×2.7, v5 +59 % к соответствующим аналогам); память — 0.0 КБ добавленной пиковой во всех сценариях.
- Жёсткая граница ввода: полная валидация всех форм, типизированные исключения, экранирование управляющих символов (безопасно для логов).
- Одна runtime-зависимость — интерфейс
psr/clock.
- «Разбор строки в объект»: ramsey/uuid и robinvdvleuten/ulid быстрее, потому что возвращают ленивые обёртки — строка сохраняется без немедленного декодирования и полной валидации. Мы сразу материализуем и проверяем 16 байт; это два единственных сценария из тринадцати, где пакет не первый.
- Молодой пакет: меньше продакшн-пробега и экосистемных интеграций (Doctrine-типы ramsey, Symfony-нормализаторы uid).
| Ситуация | Рекомендация |
|---|---|
| Несколько семейств идентификаторов, тестируемость времени, BINARY-хранение |
cloudcastle/uuid — всё в одном пакете |
| Doctrine-типы и глубокая legacy-экосистема вокруг UUID | ramsey/uuid |
| Проект на Symfony, нужен только UUID/ULID со строковым выводом | symfony/uid |
| Минимальный ULID без бинарной формы и валидации диапазона | robinvdvleuten/ulid |
| Только NanoID | hidehalo/nanoid-php |
| Snowflake с Redis/Laravel-резолвером последовательности | godruoyi/php-snowflake |
CloudCastle Uuid · · PHP 8.1+
GitHub · Packagist · Releases · Discussions · Issues
Email · Telegram · VK · Сетка · 💜 Поддержать проект
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)