Как сгенерировать UUID
Короткий ответ
UUID версии 4 — это 16 случайных байт с двумя служебными отметками:
<?php
function uuid(): string
{
$bytes = random_bytes(16);
$bytes[6] = chr(ord($bytes[6]) & 0x0f | 0x40);
$bytes[8] = chr(ord($bytes[8]) & 0x3f | 0x80);
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($bytes), 4));
}
echo uuid();Проверка формата
Строку проверяют регулярным выражением:
<?php
$pattern = '/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i';
var_dump(preg_match($pattern, '3f2b8c1e-9d4a-4c6b-8e21-5a7d9f0b1c2d') === 1);
var_dump(preg_match($pattern, 'not-a-uuid') === 1);Результат:
bool(true)
bool(false)Готовая библиотека
В проектах с Composer используют пакет ramsey/uuid или symfony/uid: они умеют и другие версии, включая упорядоченные по времени UUID версии 7.
Функции из этого ответа
- random_bytes — Возвращает случайные байты, пригодные для защиты.
- bin2hex — Преобразует байты строки в шестнадцатеричную запись.
- vsprintf — Форматирует строку по шаблону, принимая значения массивом.