Багато ідентифікаторів починаються зі звичайного лічильника бази: перший запис отримує 1, наступний — 2, а один центральний компонент гарантує відсутність повторів. Це добре працює, доки кілька застосунків, регіонів або offline clients не повинні створювати записи незалежно. UUID використовує інший підхід: кожен producer генерує значення з настільки великого простору, що випадкове зіткнення є практично неймовірним і не потребує звернення до центрального allocator.
UUID є 128-бітним значенням
Знайома hexadecimal форма на кшталт 550e8400-e29b-41d4-a716-446655440000 є читабельним представленням 128 бітів. Дефіси ділять стандартні групи, а окремі біти позначають version і variant. Ідентифікатор є унікальним не через перевірку глобального реєстру, а завдяки методу генерації та величезній кількості можливих значень.
Random UUID version 4 залишає приблизно 122 випадкові біти після службових полів. За надійного random source навіть мільярди значень залишаються далеко від практично значущого collision risk.
Різні versions використовують різні стратегії
Version UUID — не декоративна частина формату. Version 4 є випадковою. Version 1 поєднує час із node identifier і може розкрити timing або hardware-related information. Нові time-ordered versions покращують database locality без частини старих privacy-проблем. Name-based versions детерміновано створюють той самий UUID із namespace і name.
Вибір залежить від потрібних властивостей: randomness, determinism, sortability, privacy та підтримки екосистемою. Валідний UUID-рядок ще не означає, що його version відповідає задачі.
Collision risk малий, але не математично нульовий
Два random UUID теоретично можуть збігтися. Практичний ризик залежить від масштабу й якості генератора. Secure random source робить collision надзвичайно малоймовірним, але слабкий pseudo-random generator, cloned state або саморобна реалізація змінюють розрахунок.
Database uniqueness constraint усе одно потрібен. UUID усуває більшість координації та робить collision практично неможливим, а constraint зберігає цілісність, якщо припущення порушаться.
UUID змінює архітектуру створення даних
Клієнт може призначити ID до завантаження запису. Окремі бази створюють рядки, які пізніше merge-яться без renumbering. Event може посилатися на сутність ще до центрального commit. Це спрощує offline applications, distributed workflow та синхронізацію.
UUID також не показує просту кількість записів при публічному використанні. Проте guess resistance не є authorization. Кожен запит усе одно повинен перевірити право доступу до ресурсу.
Database trade-off потрібно вимірювати
Random UUID вставляється в різні частини ordered index, збільшуючи fragmentation і зменшуючи cache locality. Він також займає більше місця за компактний integer. Time-ordered UUID може покращити insertion behavior, зберігаючи незалежну генерацію.
Правильний ключ залежить від workload. Внутрішній integer може бути оптимальним в одній системі, а публічний UUID — окремим полем. Інша система використовує UUID як primary key. Рішення потрібно перевіряти query plan і реальним навантаженням.
Формат і порівняння мають бути послідовними
UUID text зазвичай case-insensitive, але API краще повертати одну canonical lowercase форму. Використовуйте native UUID або binary type там, де база його підтримує, і строго валідуйте input. Рядок із дефісами не обов’язково є правильним UUID.
Не намагайтеся читати бізнес-сенс із груп random UUID. Крім визначених version та variant bits, сегменти є способом представлення.
Серіалізація повинна точно зберігати значення
JSON не має native UUID type, тому API зазвичай передає canonical string. Client library може використовувати сильніший тип усередині, але network contract має бути явним. Несумісна collation, trimming або numeric conversion пошкоджують посилання.
Batch operations, events і logs повинні трактувати UUID як opaque identifier. Значення не можна скорочувати або змінювати для зручності відображення.
Ідентифікатор не є секретом
UUID складно вгадати, але він витікає через логи, screenshots, analytics і shared links. Authorization має захищати ресурс незалежно від identifier. Якщо саме володіння посиланням повинно давати тимчасовий доступ, використовуйте окремий expiring capability token.
Rate limit та anomaly detection залишаються потрібними. Вони захищають list endpoints, search і вже leaked references, які одна непередбачуваність ID не врятує.
UUID вирішує одну конкретну проблему
Тестове середовище не повинно ламати властивості генератора
Для fixtures зручно використовувати відомі стабільні UUID, але production code не повинен випадково успадкувати статичний generator. Integration tests мають довести, що паралельне створення records дає різні values і що retry зберігає той самий logical ID.
Окремо перевіряйте serialization через API, queue та database. Identifier має пройти повний round trip без зміни casing, trimming або binary order.
Людям потрібні інструменти для роботи з opaque ID
UUID важко запам’ятати й усно передати. Admin panel, logs і support tools повинні підтримувати точне копіювання, пошук і короткий безпечний контекст ресурсу. Не варто скорочувати UUID у місцях, де оператор може переплутати записи.
У повідомленнях користувачу краще показувати зрозумілий номер або назву, залишаючи UUID технічним reference. Ідентичність для системи та зручний display identifier можуть співіснувати.
UUID вирішує одну конкретну проблему
Кількість можливих значень не скасовує governance
Команди повинні погодити, хто генерує ID, на якому етапі він стає постійним і чи дозволяється клієнту передавати власне значення. Без правила один сервіс може замінювати identifier, а інший — вважати його immutable.
Documented lifecycle важливий для events, retry та import. UUID створюється легко, але зміна вже опублікованого ID є дорогою.
UUID дозволяє багатьом producers створювати довговічні ID без очікування центрального сервісу. Найкращий результат виникає з правильного version, secure generator, uniqueness constraint, компактного storage та явної authorization.
Ідентифікатор усуває координацію під час створення, але не замінює ordinary data engineering. Саме розуміння цієї межі робить UUID надійною основою distributed systems.