CUID Generator
Generate collision-resistant unique IDs (CUID v1)
Згенеровані CUID
CUID v1 — застарілий формат. Для нових проєктів використовуйте CUID2.
Що таке CUID?
CUID (Collision-resistant Unique IDentifier) — це глобально унікальний ідентифікатор, розроблений для горизонтально масштабованих застосунків.
Завжди починається з літери c, далі йде мітка часу, лічильник, відбиток хоста та випадковий сегмент — усе закодоване в base36.
ID є безпечними для URL, компактними та зрозумілими, що робить їх придатними для ідентифікаторів баз даних, URL і генерації сесій.
Структура CUID
Кожен CUID складається з п'яти різних секцій, що забезпечують унікальність на різних машинах, процесах і в часі:
Ця ієрархічна конструкція забезпечує хронологічне впорядкування ID зі збереженням достатньої випадкової ентропії для розподілених систем.
Стійкість до колізій
CUID поєднує кілька механізмів для гарантування унікальності:
CUID проти UUID
Як CUID, так і UUID вирішують проблему унікальності, але з різними підходами:
| Функція | CUID v1 | UUID v4 |
|---|---|---|
| Формат | Рядкові буквено-цифрові символи | Шістнадцятковий з дефісами |
| Сортування | Частково (мітка часу спочатку) | Ні (v4 випадковий) |
| Безпечний для URL | Так | Так (з дефісами) |
| Стійкість до колізій | Висока (структурна) | Висока (статистична) |
| Передбачуваність | Низька (видима мітка часу) | Дуже низька |
| Довжина | 25 символів | 36 символів |
| Потребує координації | Ні | Ні |
CUID краще підходить для видимих ідентифікаторів бази даних та URL; UUID більш поширений і має ширшу підтримку.
CUID v1 проти CUID v2
CUID v2 — це повне переписання алгоритму, що усуває проблеми безпеки в CUID v1:
| Аспект | CUID v1 | CUID v2 |
|---|---|---|
| Алгоритм | Власний | SHA3 + CSPRNG |
| Криптографічний | Ні (передбачуваний) | Так (криптографічно безпечний) |
| Мітка часу | Чітко видима | Прихована в хеші |
| Формат | Завжди починається з 'c' | Налаштовуваний префікс |
| npm-пакет | cuid | @paralleldrive/cuid2 |
| Довжина | Фіксована 25 символів | Налаштовувана (за замовчуванням 24) |
Для нових проектів рекомендується CUID v2, який забезпечує більш надійні гарантії безпеки зі збереженням простоти використання.
Поширені сценарії використання
мінімальною колізією.Приклади коду
Встановлення та базове використання:
// 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 та поширених баз даних:
// 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'Використання обмеження бази даних:
-- 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())
}