CUID Generator

Generate collision-resistant unique IDs (CUID v1)

Количество

Сгенерированные CUID

Нажмите «Сгенерировать» для создания CUID

CUID v1 — устаревший формат. Для новых проектов используйте CUID2.

Что такое CUID?

CUID (Collision-Resistant Unique Identifier) — это алгоритм с открытым исходным кодом для генерации уникальных идентификаторов, которые хорошо работают в распределённых системах без центрального координатора. В отличие от простого UUID, CUID разработан для горизонтального масштабирования — несколько серверов или вкладок браузера могут независимо генерировать идентификаторы с минимальным риском коллизии.

Каждый CUID начинается со строчной буквы c, что делает формат мгновенно узнаваемым. Оставшиеся символы — строчные буквенно-цифровые (base36), поэтому CUID безопасен для URL и может использоваться напрямую как сегмент пути URL или первичный ключ базы данных без дополнительного кодирования.

Оригинальная спецификация CUID (v1) была создана Эриком Эллиоттом и распространена через npm-пакет cuid. Теперь она заменена CUID v2, который обеспечивает криптографическую безопасность. Эта страница — и генератор выше — создаёт идентификаторы CUID v1, классический формат, всё ещё широко встречающийся в производственных кодовых базах.

Структура CUID

CUID v1 имеет длину около 25 символов и состоит из пяти конкатенированных сегментов, каждый из которых несёт различный тип энтропии:

Пример: clrc4gkwz001ag2hs3k7f9m2q
cпрефиксВсегда буква "c" — обозначает CUID
lrc4gkwzвременная меткаВременная метка в миллисекундах в base36 (~8 символов)
001aсчётчик4-символьный счётчик base36 — предотвращает коллизии в одну миллисекунду
g2hsотпечаток4-символьный отпечаток хоста base36 (информация о браузере/среде)
3k7f9m2qслучайный8-символьный случайный блок base36 — два 32-битных значения

Сегменты просто конкатенируются — разделителей нет. Общая длина немного варьируется в зависимости от текущего значения временной метки, но остаётся около 25 символов.

Как CUID Предотвращает Коллизии

Устойчивость к коллизиям достигается за счёт наложения независимых источников энтропии, так что даже в наихудших сценариях (тысячи идентификаторов в миллисекунду на многих машинах) вероятность двух одинаковых идентификаторов остаётся ничтожно малой.

Временная Метка в Миллисекундах
Первый сегмент кодирует текущее время в base36. Идентификаторы, созданные в разные моменты, автоматически сортируются лексикографически по времени создания — полезно для пагинации и отладки.
Монотонный Счётчик
В рамках одного процесса 4-символьный счётчик увеличивается с каждым созданным идентификатором. Даже если два вызова происходят в одну миллисекунду на одной машине, счётчик гарантирует уникальность для до 65 536 идентификаторов в миллисекунду.
Отпечаток Машины
Хэш, полученный из данных, специфичных для среды (ID процесса + имя хоста в Node.js; размеры экрана + информация о navigator в браузере). Это различает идентификаторы, созданные на разных хостах в одну и ту же миллисекунду с одним значением счётчика.
Случайный Блок
Последние 8 символов берутся из двух независимых 32-битных случайных значений, закодированных в base36. Это добавляет финальный слой энтропии, защищающий от коллизий, даже если отпечатки двух машин оказываются одинаковыми.

CUID vs UUID v4

И CUID, и UUID v4 широко используются для генерации идентификаторов на стороне клиента. Они подходят к одной проблеме по-разному:

ХарактеристикаCUID v1UUID v4
Форматc + base36 (~25 символов)hex-группы (36 символов с дефисами)
СортируемыйПриблизительно (префикс временной метки)Нет
Безопасен для URLДа (только буквенно-цифровые)В основном (дефисы допустимы в URL)
Устойчивость к коллизиямВысокая — временная метка + счётчик + отпечаток + случайностьВысокая — 122 бита случайности
ПредсказуемостьЧастично (временная метка видна)Нет (чисто случайный)
Длина~25 символов36 символов
Требует координацииНетНет

UUID v4 является более безопасным выбором для сценариев, чувствительных к безопасности, поскольку не раскрывает информацию о времени. CUID имеет преимущество, когда нужны приблизительно сортируемые, более короткие идентификаторы без дефисов — удобно для URL, имён файлов или логов.

CUID v1 vs CUID2

Спецификация CUID была значительно пересмотрена. Понимание различий помогает выбрать правильную версию для вашего проекта:

АспектCUID v1CUID v2
АлгоритмДетерминированные компонентыНа основе SHA-3, полностью непрозрачный
КриптографическийНетДа
Временная метка виднаДаНет
ФорматНачинается с "c"Начинается с "c" (настраиваемо)
npm-пакет@paralleldrive/cuid (устарел)@paralleldrive/cuid2
Длина~25 символов24 символа (по умолчанию, настраиваемо)

Для новых проектов рекомендуется CUID v2. Его конструкция на основе SHA-3 означает, что вывод непрозрачен — временную метку, счётчик или отпечаток нельзя извлечь из идентификатора. Используйте CUID v1 только при необходимости обратной совместимости с существующим набором данных или реализации без зависимостей.

Варианты Использования

Распределённые Базы Данных
Несколько шардов базы данных или микросервисов могут независимо генерировать первичные ключи без таблицы последовательностей или центральной службы идентификаторов, устраняя единую точку отказа.
Генерация Идентификаторов на Стороне Клиента
Браузер может присвоить CUID новой записи перед отправкой на сервер, что позволяет делать оптимистичные обновления интерфейса и устраняет необходимость в запросе к серверу для получения идентификатора.
Offline-First приложения
Мобильные или PWA-приложения, работающие без подключения, могут создавать записи со стабильными идентификаторами, которые переживают синхронизацию — без конфликтов при восстановлении соединения.
URL-слаги
CUID содержат только буквенно-цифровые символы, что делает их безопасными для прямого встраивания в пути URL без процентного кодирования. Префикс временной метки добавляет приблизительный порядок по времени создания.
Корреляция Событий / Журналов
Поскольку временная метка закодирована в первом сегменте, записи журнала с метками CUID можно приблизительно сортировать по времени создания даже в распределённых агрегаторах журналов.
ORM / Prisma по умолчанию
Prisma использует CUID как стратегию @id по умолчанию для строковых первичных ключей — @default(cuid()) — что делает его одним из наиболее широко используемых форматов идентификаторов в экосистеме JavaScript.

Примеры Кода

Установите официальный пакет CUID v2 (рекомендуется) или напишите минимальную реализацию v1 без зависимостей:

JavaScript / TypeScript
// npm install @paralleldrive/cuid2  (recommended — CUID v2)
import { createId } from '@paralleldrive/cuid2'

const id = createId()
// → 'tz4a98xxat96iws9zmbrgj3a'

// Custom length
import { init } from '@paralleldrive/cuid2'
const createShortId = init({ length: 10 })
createShortId() // → 'zxp1l6mf4c'

Если предпочитаете реализацию Node.js без зависимостей алгоритма v1:

Node.js (no dependencies)
// Pure Node.js — CUID v1 style (no dependencies)
let counter = 0

function pad(str, size) {
  return str.padStart(size, '0').slice(-size)
}

function fingerprint() {
  const os = require('os')
  const source = [process.pid, os.hostname().length].join('')
  let hash = 0
  for (const c of source) {
    hash = ((hash << 5) - hash) + c.charCodeAt(0)
    hash |= 0
  }
  return pad(Math.abs(hash).toString(36), 4)
}

function cuid() {
  const timestamp = Date.now().toString(36)
  const cnt       = pad((counter++ & 0xffff).toString(36), 4)
  const fp        = fingerprint()
  const rnd       = pad(Math.floor(Math.random() * 0xffffffff).toString(36), 4)
              + pad(Math.floor(Math.random() * 0xffffffff).toString(36), 4)
  return 'c' + timestamp + cnt + fp + rnd
}

console.log(cuid()) // → 'clrc4gkwz001ag2hs3k7f9m2q'

Использование CUID в качестве первичного ключа базы данных с Prisma и PostgreSQL:

Prisma / SQL
-- Use CUID as a primary key in PostgreSQL
CREATE TABLE users (
  id   TEXT        PRIMARY KEY DEFAULT gen_cuid(),
  name TEXT        NOT NULL,
  created_at TIMESTAMPTZ DEFAULT now()
);

-- Prisma schema (auto-generates CUID by default)
model User {
  id        String   @id @default(cuid())
  name      String
  createdAt DateTime @default(now())
}

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

Является ли CUID безопасным для URL?
Да. CUID v1 использует только строчные буквы и цифры (кодировка base36), которые являются URL-безопасными символами. При использовании CUID в пути URL или параметре запроса процентное кодирование не требуется.
Является ли CUID криптографически безопасным?
Нет. CUID v1 использует Math.random() и открывает видимый префикс временной метки. Он не подходит для целей, чувствительных к безопасности, таких как токены сессии или ссылки для сброса пароля. Для таких случаев используйте crypto.randomUUID() или CUID v2.
CUID vs NanoID — что выбрать?
NanoID криптографически безопасен, короче (21 символ по умолчанию) и использует настраиваемый алфавит. Выбирайте NanoID, когда важна безопасность или нужен более короткий идентификатор. Выбирайте CUID, когда хотите приблизительно сортируемый идентификатор с префиксом временной метки, удобный для отладки.
Использовать CUID v1 или CUID v2?
CUID v2 — текущая рекомендация. Он криптографически безопасен, не раскрывает информацию о времени и активно поддерживается. CUID v1 полезен при необходимости простой реализации без зависимостей или поддержке устаревшей системы. Этот генератор создаёт идентификаторы CUID v1.
CUID vs ULID — в чём разница?
Оба имеют префикс временной метки и лексикографически сортируемы. ULID использует Crockford base32 (128 бит всего, 48-битная временная метка + 80 бит случайности), что делает его немного более случайным. CUID добавляет отпечаток машины и монотонный счётчик, что улучшает устойчивость к коллизиям на одном хосте в одну миллисекунду. ULID сортируется надёжнее, потому что временная метка занимает полную старшую часть.
Гарантирует ли CUID уникальность?
Ни одна схема идентификаторов не может дать математическую гарантию без центрального координатора. CUID делает коллизии крайне маловероятными, комбинируя четыре независимых источника энтропии: временную метку, счётчик процесса, отпечаток машины и случайные данные. На практике коллизии гораздо менее вероятны, чем отказ оборудования.