Генератор ULID
Генерує ULID у браузері й показує час, зашитий у перших десяти символах кожного.
Дає ідентифікатори, які сортуються за часом і читаються очима
Ідентифікатори для замовлень, подій чи файлів, які мають сортуватись у порядку створення й не виглядати як автоінкремент. Інструмент генерує ULID у браузері й поруч показує час, з якого кожен складено, щоб було видно, як вони впорядковані.
ULID це 128 бітів: 48 бітів часу в мілісекундах і 80 випадкових, записані 26 символами Crockford base32. У Laravel є Str::ulid() і трейт HasUlids для моделей, у Symfony клас Ulid із symfony/uid. Обидва дають монотонні значення в межах мілісекунди.
use Illuminate\Support\Str;
$id = (string) Str::ulid(); // 01J6ZK8Q3W9X4T2N5R7V8Y0AB1
// Модель із ULID замість автоінкремента
use Illuminate\Database\Eloquent\Concerns\HasUlids;
class Upload extends Model
{
use HasUlids;
}
// Symfony
$ulid = new \Symfony\Component\Uid\Ulid();
$createdAt = $ulid->getDateTime(); // час із перших 48 бітів
Що питають про цей інструмент
Обидва містять час на початку й сортуються. ULID коротший (26 символів проти 36), без дефісів і в алфавіті Crockford без схожих символів, тому його зручно диктувати й читати з логу. UUID v7 стандартніший: його розуміють тип uuid у PostgreSQL і будь-яка бібліотека. Для публічних ідентифікаторів у URL часто беруть ULID, для первинних ключів UUID v7.
Так, перші десять символів це мілісекунди від епохи Unix у base32. Інструмент їх розшифровує. Це зручно для дебагу і водночас означає, що ULID розкриває час створення запису; для чутливих сутностей це варто врахувати.
Два ULID в одну мілісекунду отримують випадкові хвости, і їхній порядок довільний. Специфікація дозволяє інкрементувати випадкову частину, щоб зберегти порядок; symfony/uid і Laravel Str::ulid() так і роблять у межах одного процесу.