CUID Generator
Generate collision-resistant unique IDs (CUID v1)
Gegenereerde CUIDs
CUID v1 is een legacy-formaat. Gebruik CUID2 voor nieuwe projecten.
Wat is CUID?
CUID (Collision-Resistant Unique Identifier) is een open-source algoritme voor het genereren van unieke ID's die goed werken in gedistribueerde systemen zonder een centrale coördinator. In tegenstelling tot een eenvoudige UUID is een CUID ontworpen om horizontaal schaalbaar te zijn — meerdere servers of browsertabbladen kunnen elk onafhankelijk ID's genereren met minimaal risico op botsingen.
Elke CUID begint met de kleine letter c, waardoor het formaat in één oogopslag herkenbaar is. De resterende tekens zijn allemaal kleine alfanumerieke tekens (base36), zodat een CUID URL-veilig is en direct als URL-padsegment of database-primaire sleutel kan worden gebruikt zonder extra codering.
De originele CUID-specificatie (v1) werd gemaakt door Eric Elliott en gepopulariseerd via het npm-pakket cuid. Het is nu vervangen door CUID v2, dat cryptografische beveiliging biedt. Deze pagina — en de bovenstaande generator — produceert CUID v1-ID's, het klassieke formaat dat nog steeds veel voorkomt in productiecodebases.
CUID-structuur
Een CUID v1 is ongeveer 25 tekens lang en bestaat uit vijf aaneengeschakelde segmenten, elk met een ander type entropie:
De segmenten worden eenvoudig aaneengeschakeld — er zijn geen scheidingstekens. De totale lengte varieert enigszins afhankelijk van de huidige tijdstempelwaarde, maar blijft op ongeveer 25 tekens.
Hoe CUID Botsingen Voorkomt
Botsingsresistentie komt voort uit het stapelen van onafhankelijke entropiebronnen, zodat zelfs in slechtste gevallen (duizenden ID's per milliseconde op veel machines) de kans op twee identieke ID's verwaarloosbaar klein blijft.
CUID vs UUID v4
Zowel CUID als UUID v4 worden veel gebruikt voor ID-generatie aan de clientzijde. Ze hanteren verschillende benaderingen voor hetzelfde probleem:
| Kenmerk | CUID v1 | UUID v4 |
|---|---|---|
| Formaat | c + base36 (~25 tekens) | hex-groepen (36 tekens met koppeltekens) |
| Sorteerbaar | Ruwweg (tijdstempelprefix) | Nee |
| URL-veilig | Ja (alleen alfanumeriek) | Grotendeels (koppeltekens zijn geldig in URL's) |
| Botsingsresistentie | Hoog — tijdstempel + teller + vingerafdruk + willekeurig | Hoog — 122 bits willekeurig |
| Voorspelbaarheid | Gedeeltelijk (tijdstempel zichtbaar) | Geen (puur willekeurig) |
| Lengte | ~25 tekens | 36 tekens |
| Vereist coördinatie | Nee | Nee |
UUID v4 is de veiligere keuze voor beveiligingsgevoelige scenario's omdat het geen tijdinformatie onthult. CUID heeft een voordeel wanneer u ID's wilt die ruwweg sorteerbaar, korter en vrij van koppeltekens zijn — handig voor gebruik in URL's, bestandsnamen of logs waar u snel wilt identificeren wanneer een record is aangemaakt.
CUID v1 vs CUID2
De CUID-specificatie is aanzienlijk herzien. Het begrijpen van de verschillen helpt u de juiste versie voor uw project te kiezen:
| Aspect | CUID v1 | CUID v2 |
|---|---|---|
| Algoritme | Deterministische componenten | SHA-3 gebaseerd, volledig ondoorzichtig |
| Cryptografisch | Nee | Ja |
| Tijdstempel zichtbaar | Ja | Nee |
| Formaat | Begint met "c" | Begint met "c" (configureerbaar) |
| npm-pakket | @paralleldrive/cuid (verouderd) | @paralleldrive/cuid2 |
| Lengte | ~25 tekens | 24 tekens (standaard, configureerbaar) |
Voor nieuwe projecten is CUID v2 de aanbevolen keuze. De SHA-3-gebaseerde constructie betekent dat de uitvoer ondoorzichtig is — geen tijdstempel, teller of vingerafdruk kan worden teruggewerkt uit het ID. Gebruik CUID v1 alleen wanneer u achterwaartse compatibiliteit met een bestaande dataset nodig heeft of een implementatie zonder afhankelijkheden wilt.
Gebruiksscenario's
@id-strategie voor String primaire sleutels — @default(cuid()) — waardoor het een van de meest gebruikte ID-formaten in het JavaScript-ecosysteem is.Codevoorbeelden
Installeer het officiële CUID v2-pakket (aanbevolen) of schrijf een minimale v1-implementatie zonder afhankelijkheden:
// 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'Als u de voorkeur geeft aan een afhankelijkheidsvrije Node.js-implementatie van het v1-algoritme:
// 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 gebruiken als database primaire sleutel met Prisma en 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())
}