Що таке ULID?
ULID (Універсальний Унікальний Лексикографічно Сортований Ідентифікатор) — це 128-бітний формат ідентифікатора, розроблений для подолання обмежень UUID. Він складається з:
- Часова мітка: 48 бітів часу Unix з мілісекундною точністю
- Випадковість: 80 бітів криптографічно безпечних випадкових даних
- Кодування: представлення в Base32 (26 символів)
Приклад формату: 01ARZ3NDEKTSV4RRFFQ69G5FAV
Як працює ULID
- Генерує 48 бітів для часової мітки (Unix-час у мілісекундах)
- Генерує 80 бітів криптографічно безпечних випадкових даних
- Комбінує часову мітку (найбільш значущу) з випадковістю (найменш значущою)
- Кодує все 128-бітне значення за допомогою алфавіту Крокфорда Base32
- Результатом є 26-символьний рядок (перші 10 символів — часова мітка, останні 16 — випадковість)
Переваги та міркування
Переваги | Міркування |
---|---|
|
|
Структура ULID
Компонент | Біти | Символи | Опис |
---|---|---|---|
Часова мітка | 48 бітів | 10 символів | Unix-часова мітка (мс), закодована в Base32 |
Випадковість | 80 бітів | 16 символів | Випадкові байти, закодовані в Base32 |
Порівняння ULID та UUID
Функція | ULID | UUID v1 | UUID v4 | UUID v7 |
---|---|---|---|---|
Розмір | 128 бітів | 128 бітів | 128 бітів | 128 бітів |
Довжина рядка | 26 символів | 36 символів | 36 символів | 36 символів |
На основі часу | ✅ | ✅ | ❌ | ✅ |
Природне сортування | ✅ | ❌ | ❌ | ✅ |
Безпека URL | ✅ | ❌ | ❌ | ❌ |
Розкриття MAC-адреси | ❌ | ✅ | ❌ | ❌ |
Випадковий компонент | ✅ | ❌ | ✅ | ✅ |
Канонічний стандарт | ❌ | ✅ | ✅ | ⚠️ Чернетка |
Поширені випадки використання
- Первинні ключі бази даних: Оптимізовані за продуктивністю індекси
- Розподілені системи: Генерація без координації
- API: Чисті, безпечні для URL ідентифікатори
- Дані часових рядів: Нативне хронологічне впорядкування
- Системи журналювання: Ідентифікатори подій, що сортуються
- Сучасні застосунки: Де обмеження UUID є проблематичними
Чому варто обрати ULID?
- Сортованість: Лексикографічно сортується за часом створення
- Безпека URL: Не потрібне URL-кодування (на відміну від UUID з дефісами)
- Компактність: 26 символів проти 36 для UUID
- Нечутливість до регістру: Зменшує помилки введення користувачем
- Монотонність: Опціональне монотонне сортування в межах тієї ж мілісекунди
- Відсутність спеціальних символів: Простий, лише буквено-цифровий формат
Часті запитання
Як ULID порівнюється з UUID v7?
Обидва використовують Unix-часові мітки для сортованості та мають випадкові компоненти. Ключові відмінності полягають у кодуванні (Base32 проти шістнадцяткового), форматі (26 символів проти 36) та стандартизації (UUID v7 знаходиться в стадії чернетки специфікації RFC).
Чи можу я витягти час створення з ULID?
Так. Перші 10 символів представляють Unix-часову мітку з мілісекундною точністю, яку можна декодувати та перетворити на стандартний формат дати/часу.
Чи сумісні ULID з полями UUID в базах даних?
Ні. ULID використовують інший формат і повинні зберігатися як рядки або бінарні дані, а не в нативних типах UUID баз даних.
Що таке монотонність у ULID?
Деякі реалізації ULID пропонують монотонну опцію, яка забезпечує послідовний порядок сортування навіть у межах однієї мілісекунди, збільшуючи випадковий компонент для ULID, створених в одній часовій мітці.
Який набір символів використовує ULID?
ULID використовує кодування Base32 за Крокфордом (0-9, A-Z за винятком I, L, O, U), яке розроблено для мінімізації плутанини та помилок транскрипції при ручному читанні або введенні ідентифікаторів.
Ресурси
Алфавіт Base32 за Крокфордом
Значення кодування | Символ | Примітки |
---|---|---|
0-9 | 0-9 | Десяткові цифри |
10-31 | A-Z | За винятком I, L, O, U для кращої читабельності |
Символи: 0123456789ABCDEFGHJKMNPQRSTVWXYZ
Це кодування нечутливе до регістру для декодування (але ULID зазвичай генеруються у верхньому регістрі).