Перейти к содержимому

Эффективный генератор CUID для уникальных идентификаторов в системах

Генерируйте уникальные идентификаторы (CUID), устойчивые к коллизиям, для распределенных систем, баз данных и веб-приложений. Создавайте масштабируемые, сортируемые идентификаторы мгновенно.

Генератор CUID

Быстро и легко создавайте идентификаторы, устойчивые к коллизиям.

Нажмите «Сгенерировать новый CUID», чтобы создать идентификатор.
Калькулятор загрузки...
📚

Документация

Что такое CUID?

CUID (устойчивый к коллизиям уникальный идентификатор) — это короткая строка из букв и цифр, используемая для обозначения записи, файла или события, чтобы никакие два объекта не имели одинакового имени. Этот инструмент создаёт CUID2, текущую версию формата, с помощью библиотеки @paralleldrive/cuid2. Каждый идентификатор состоит из 25 символов, содержит только строчные буквы и цифры и полностью создаётся в браузере — на сервер ничего не отправляется.

Как пользоваться этим генератором CUID

  1. Нажмите Создать новый CUID, чтобы создать идентификатор.
  2. Нажмите Копировать в буфер обмена, чтобы скопировать его.
  3. Вставьте идентификатор в базу данных, имя файла или приложение.
  4. Снова нажмите кнопку создания, чтобы получить другой идентификатор. Совпадения между отдельными значениями CUID2 крайне маловероятны, хотя математически исключить их невозможно.
  5. Нажмите Сбросить, чтобы удалить результат.

Созданный идентификатор также сохраняется в 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 и автоинкрементные идентификаторы

ХарактеристикаCUID2UUID v4Автоинкремент
Длина25 символов36 символов (с дефисами)Различается (обычно короткое число)
Набор символовСтрочные буквы и цифрыШестнадцатеричные цифры и дефисыЦифры
Требуется централизованная координацияНетНетДа (последовательность базы данных)
Сортировка по времени созданияНетНетДа
Удобен для URL без кодированияДаДаДа

CUID2 и UUID v4 решают одну и ту же задачу: создание идентификаторов без централизованной координации. CUID2 короче и использует меньший набор символов, поэтому его проще читать и вставлять в URL. UUID также безопасен для использования в веб-адресе, поскольку дефис является незарезервированным символом в URL, но он на 11 символов длиннее.

Распространённые применения

  • Первичные ключи в распределённых базах данных, где несколько серверов независимо добавляют строки
  • Идентификаторы запросов или трассировки, используемые для отслеживания одного действия в нескольких микросервисах
  • Имена файлов загружаемых объектов, чтобы два файла никогда не перезаписывали друг друга
  • Идентификаторы сеансов или токенов веб-приложений
  • Идентификаторы сообщений в очередях, таких как Kafka или RabbitMQ

Краткая история

Исходный формат CUID был выпущен Эриком Эллиоттом в 2012 году как альтернатива UUID для распределённых приложений. Формат CUID2, опубликованный тем же проектом Paralleldrive, был переработан на основе криптографического хеша; из него удалили отметку времени и счётчик, доступные для восстановления в исходной версии. Этот инструмент создаёт только идентификаторы CUID2.

Часто задаваемые вопросы

В чём разница между CUID (v1) и CUID2? CUID v1 хранил внутри идентификатора видимые отметку времени и счётчик. Благодаря этому идентификаторы можно было сортировать, но при этом раскрывалось, когда и сколько идентификаторов было создано. CUID2 заменяет эти видимые поля односторонним хешем, поэтому извлечь из идентификатора какие-либо сведения невозможно.

Можно ли сортировать CUID этого инструмента по времени создания? Нет. В CUID2 нет доступной для восстановления отметки времени, поэтому упорядочить идентификаторы по времени их создания, просто взглянув на строку, невозможно.

Какова длина созданного идентификатора и можно ли её изменить? Этот инструмент всегда создаёт идентификаторы длиной 25 символов. В нём нет возможности запросить другую длину.

Могут ли две разные машины одновременно создать одинаковый CUID2? Теоретически это возможно, но на практике крайне маловероятно. Каждый идентификатор сочетает отпечаток, характерный для хоста, со случайной энтропией, поэтому независимые машины почти наверняка никогда не создадут одинаковый хеш.

Отправляет ли этот инструмент какие-либо данные на сервер? Нет. Идентификатор создаётся выполняемым в браузере JavaScript с использованием локальных системных часов и случайных данных, предоставляемых браузером. Никакие данные не передаются.

Можно ли использовать CUID2 в качестве первичного ключа базы данных? Да. Идентификаторы CUID2 хорошо подходят для использования в качестве первичных ключей в распределённых базах данных, поскольку любой узел может создать такой идентификатор без обращения к централизованной последовательности. Естественным образом они не сортируются по времени вставки, поэтому приложению, которому требуется такой порядок, следует хранить отдельный столбец created_at.