CUID Generator
Generate collision-resistant unique IDs (CUID v1)
Vygenerovaná CUID
CUID v1 je starší formát. Pro nové projekty použijte CUID2.
Co je CUID?
CUID (Collision-resistant Unique IDentifier) je globálně jedinečný identifikátor navržený pro horizontálně škálovatelné aplikace.
Vždy začíná písmenem c, za nímž následuje časové razítko, čítač, otisk hostitele a náhodný segment — vše zakódováno v base36.
ID jsou bezpečná pro URL, kompaktní a čitelná, vhodná pro databázová ID, URL a generování relací.
Struktura CUID
Každý CUID se skládá z pěti různých sekcí zajišťujících jedinečnost napříč stroji, procesy a časem:
Toto hierarchické uspořádání zajišťuje chronologické řazení ID při zachování dostatečné náhodné entropie pro distribuované systémy.
Odolnost vůči kolizím
CUID kombinuje několik mechanismů pro zajištění jedinečnosti:
CUID vs UUID
CUID i UUID řeší problém jedinečnosti, ale s různými přístupy:
| Vlastnost | CUID v1 | UUID v4 |
|---|---|---|
| Formát | Malá alfanumerická písmena | Hexadecimální s pomlčkami |
| Tříditelný | Částečně (nejdříve časové razítko) | Ne (v4 náhodné) |
| Bezpečný pro URL | Ano | Ano (s pomlčkami) |
| Odolnost vůči kolizím | Vysoká (strukturální) | Vysoká (statistická) |
| Předvídatelnost | Nízká (viditelné časové razítko) | Velmi nízká |
| Délka | 25 znaků | 36 znaků |
| Vyžaduje koordinaci | Ne | Ne |
CUID je lepší pro viditelná databázová ID a URL; UUID je rozšířenější a má širší podporu.
CUID v1 vs CUID v2
CUID v2 je kompletní přepsání algoritmu řešící bezpečnostní problémy CUID v1:
| Aspekt | CUID v1 | CUID v2 |
|---|---|---|
| Algoritmus | Vlastní | SHA3 + CSPRNG |
| Kryptografický | Ne (předvídatelný) | Ano (kryptograficky bezpečný) |
| Časové razítko | Jasně viditelné | Skryté v hashu |
| Formát | Vždy začíná 'c' | Přizpůsobitelný prefix |
| npm balíček | cuid | @paralleldrive/cuid2 |
| Délka | Pevných 25 znaků | Přizpůsobitelná (výchozí 24) |
Pro nové projekty se doporučuje CUID v2, který poskytuje silnější bezpečnostní záruky při zachování snadného použití.
Běžné případy použití
minimálních kolizí.Příklady kódu
Instalace a základní použití:
// 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'Integrace Node.js a běžných databází:
// 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'Použití databázového omezení:
-- 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())
}