Ефективний генератор CUID для унікальних ідентифікаторів у системах
Генеруйте стійкі до колізій унікальні ідентифікатори (CUID) для розподілених систем, баз даних та веб-додатків. Миттєво створюйте масштабовані, сортовані ідентифікатори.
Генератор CUID
Швидко та легко створіть ідентифікатор, стійкий до колізій.
Документація
Що таке CUID?
CUID (унікальний ідентифікатор, стійкий до колізій) — це короткий рядок літер і цифр, який використовують для позначення запису, файлу або події, щоб жодні два об’єкти не мали однакового імені. Цей інструмент створює CUID2, поточну версію формату, за допомогою бібліотеки @paralleldrive/cuid2. Кожен ідентифікатор має довжину 25 символів, містить лише малі літери й цифри та повністю створюється у браузері — нічого не надсилається на сервер.
Як користуватися цим генератором CUID
- Натисніть Generate New CUID, щоб створити ідентифікатор.
- Натисніть Copy to Clipboard, щоб скопіювати його.
- Вставте ідентифікатор у базу даних, ім’я файлу або програму.
- Натисніть кнопку генерації ще раз, щоб отримати інший ідентифікатор. Колізії між окремими значеннями CUID2 надзвичайно малоймовірні, хоча математично неможливими їх назвати не можна.
- Натисніть Reset, щоб очистити результат.
Створений ідентифікатор також зберігається в URL-адресі сторінки, тому посилання на результат можна поширити або додати в закладки.
Структура та формула CUID2
CUID2 будується так:
1id = randomLetter + base36( SHA3-512( time + entropy + counter + fingerprint ) ).substring(1, length)
2Хеш-функція поєднує чотири внутрішні вхідні дані: поточний час, лічильник сеансу, відбиток хост-комп’ютера та випадкову ентропію. Вона обробляє їх за допомогою SHA3-512, перетворює результат у систему числення з основою 36 (цифри 0–9 і літери a–z), а потім залишає 24 із цих символів. Випадкова початкова літера збільшує довжину готового ідентифікатора до 25 символів — саме таку довжину встановлено для цього інструмента.
Лише перший символ є окремим: це випадкова літера на початку, завдяки якій кожен ідентифікатор починається з літери, а не з цифри. Багато систем, зокрема назви таблиць і стовпців SQL, вимагають, щоб ідентифікатори починалися з літери, тому CUID2 безпечно використовувати як ім’я майже будь-де. Кожен символ після першої літери є частиною одного безперервного непрозорого тіла хешу — окремих секцій у ньому немає.
Оскільки хеш працює лише в одному напрямку, жодні його вхідні дані неможливо відновити з готового ідентифікатора. CUID2 не містить відновлюваної часової мітки, лічильника чи відбитка. Це свідоме рішення на користь конфіденційності та безпеки: сам ідентифікатор не може розкрити, коли або де його було створено.
Приклад обчислення
За допомогою цього інструмента можна створити ідентифікатор такого вигляду:
1vcpuhcj51eomj1o31dnlqopu0
2Тут v — випадкова початкова літера, а cpuhcj51eomj1o31dnlqopu0 (24 символи) — тіло хешу. Дві частини відрізняються лише зовнішнім виглядом, оскільки перший символ гарантовано є літерою, тоді як тіло хешу може містити поєднання літер і цифр.
Навіщо системи використовують CUID2
- Координація не потрібна. Будь-яка машина може самостійно створити дійсний ідентифікатор, не запитуючи центральний сервер або базу даних про наступне значення.
- Стійкість до колізій. Поєднання часу, лічильника, відбитка хост-комп’ютера та випадкової ентропії робить надзвичайно малоймовірним створення однакових ідентифікаторів двома машинами, навіть якщо вони генерують багато ідентифікаторів за секунду.
- Зручність для URL. CUID2 використовує лише малі літери й цифри, тому для використання у веб-адресі його не потрібно кодувати.
- Швидка генерація із забезпеченням конфіденційності. Оскільки цей інструмент запускає генератор у браузері, ідентифікатори створюються миттєво й ніколи не залишають пристрій.
Ідентифікатори CUID2 не можна впорядкувати за часом створення. На відміну від автоінкрементного числа в базі даних або формату старішого CUID (версія 1), CUID2 приховує часову мітку всередині хешу, а не зберігає її у відкритому вигляді. Програми, яким потрібно сортувати записи за порядком створення, мають зберігати окремий стовпець із часовою міткою поруч з ідентифікатором.
CUID2 проти UUID та автоінкрементних ідентифікаторів
| Характеристика | CUID2 | UUID версії 4 | Автоінкремент |
|---|---|---|---|
| Довжина | 25 символів | 36 символів (із дефісами) | Залежить від системи (зазвичай коротке число) |
| Набір символів | Малі літери й цифри | Шістнадцяткові цифри та дефіси | Цифри |
| Потребує централізованої координації | Ні | Ні | Так (послідовність бази даних) |
| Сортування за часом створення | Ні | Ні | Так |
| Зручність для URL без кодування | Так | Так | Так |
CUID2 і UUID версії 4 розв’язують одну й ту саму проблему: генерування ідентифікаторів без централізованої координації. CUID2 коротший і використовує менший набір символів, тому його легше читати й вставляти в URL. UUID також безпечно використовувати у веб-адресі, оскільки дефіс є незарезервованим символом у URL, але він на 11 символів довший.
Поширені способи використання
- Первинні ключі в розподілених базах даних, де кілька серверів незалежно вставляють рядки
- Ідентифікатори запитів або трасування, за допомогою яких одну дію відстежують у кількох мікросервісах
- Імена файлів для завантажених файлів, щоб два файли ніколи не перезаписували один одного
- Ідентифікатори сеансів або токенів для вебзастосунків
- Ідентифікатори повідомлень у чергах, таких як Kafka або RabbitMQ
Коротка історія
Оригінальний формат CUID випустив Ерік Елліотт у 2012 році як альтернативу UUID для розподілених програм. CUID2, опублікований тим самим проєктом Paralleldrive, було перероблено на основі криптографічного хешу, а відновлювані часову мітку та лічильник, які розкривав оригінальний формат, було вилучено. Цей інструмент генерує лише ідентифікатори CUID2.
Поширені запитання
У чому різниця між CUID версії 1 та CUID2? CUID версії 1 зберігав у ідентифікаторі видимі часову мітку та лічильник, завдяки чому ідентифікатори можна було сортувати, але водночас розкривалося, коли і скільки ідентифікаторів було створено. CUID2 замінює ці видимі поля одностороннім хешем, тому з ідентифікатора неможливо зчитати жодну інформацію.
Чи можна сортувати ідентифікатори CUID із цього інструмента за часом створення? Ні. CUID2 не містить відновлюваної часової мітки, тому ідентифікатори неможливо впорядкувати за часом їх генерування, просто переглянувши рядок.
Яка довжина створеного ідентифікатора і чи можна її змінити? Цей інструмент завжди генерує ідентифікатори завдовжки 25 символів. У ньому немає можливості вказати іншу довжину.
Чи можуть дві різні машини одночасно створити однаковий CUID2? Теоретично це можливо, але на практиці надзвичайно малоймовірно. Кожен ідентифікатор поєднує відбиток, унікальний для хоста, із випадковою ентропією, тому незалежні машини з дуже малою ймовірністю коли-небудь створять однаковий хеш.
Чи надсилає цей інструмент якісь дані на сервер? Ні. Ідентифікатор генерується JavaScript-кодом у браузері з використанням локального системного годинника та випадкових даних, які надає браузер. Нічого не передається.
Чи можна використовувати CUID2 як первинний ключ бази даних?
Так. Ідентифікатори CUID2 добре підходять як первинні ключі в розподілених базах даних, оскільки будь-який вузол може створити їх без звернення до централізованої послідовності. Вони не впорядковуються природним чином за часом вставлення, тому програма, якій потрібен такий порядок, має зберігати окремий стовпець created_at.