CUID Generator
Generate collision-resistant unique IDs (CUID v1)
Сгенерированные 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 символов и состоит из пяти конкатенированных сегментов, каждый из которых несёт различный тип энтропии:
Сегменты просто конкатенируются — разделителей нет. Общая длина немного варьируется в зависимости от текущего значения временной метки, но остаётся около 25 символов.
Как CUID Предотвращает Коллизии
Устойчивость к коллизиям достигается за счёт наложения независимых источников энтропии, так что даже в наихудших сценариях (тысячи идентификаторов в миллисекунду на многих машинах) вероятность двух одинаковых идентификаторов остаётся ничтожно малой.
CUID vs UUID v4
И CUID, и UUID v4 широко используются для генерации идентификаторов на стороне клиента. Они подходят к одной проблеме по-разному:
| Характеристика | CUID v1 | UUID v4 |
|---|---|---|
| Формат | c + base36 (~25 символов) | hex-группы (36 символов с дефисами) |
| Сортируемый | Приблизительно (префикс временной метки) | Нет |
| Безопасен для URL | Да (только буквенно-цифровые) | В основном (дефисы допустимы в URL) |
| Устойчивость к коллизиям | Высокая — временная метка + счётчик + отпечаток + случайность | Высокая — 122 бита случайности |
| Предсказуемость | Частично (временная метка видна) | Нет (чисто случайный) |
| Длина | ~25 символов | 36 символов |
| Требует координации | Нет | Нет |
UUID v4 является более безопасным выбором для сценариев, чувствительных к безопасности, поскольку не раскрывает информацию о времени. CUID имеет преимущество, когда нужны приблизительно сортируемые, более короткие идентификаторы без дефисов — удобно для URL, имён файлов или логов.
CUID v1 vs CUID2
Спецификация CUID была значительно пересмотрена. Понимание различий помогает выбрать правильную версию для вашего проекта:
| Аспект | CUID v1 | CUID v2 |
|---|---|---|
| Алгоритм | Детерминированные компоненты | На основе SHA-3, полностью непрозрачный |
| Криптографический | Нет | Да |
| Временная метка видна | Да | Нет |
| Формат | Начинается с "c" | Начинается с "c" (настраиваемо) |
| npm-пакет | @paralleldrive/cuid (устарел) | @paralleldrive/cuid2 |
| Длина | ~25 символов | 24 символа (по умолчанию, настраиваемо) |
Для новых проектов рекомендуется CUID v2. Его конструкция на основе SHA-3 означает, что вывод непрозрачен — временную метку, счётчик или отпечаток нельзя извлечь из идентификатора. Используйте CUID v1 только при необходимости обратной совместимости с существующим набором данных или реализации без зависимостей.
Варианты Использования
@id по умолчанию для строковых первичных ключей — @default(cuid()) — что делает его одним из наиболее широко используемых форматов идентификаторов в экосистеме JavaScript.Примеры Кода
Установите официальный пакет CUID v2 (рекомендуется) или напишите минимальную реализацию v1 без зависимостей:
// 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:
// 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:
-- 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())
}