Générateur CUID
Génère des IDs uniques résistants aux collisions (CUID v1)
CUIDs générés
CUID v1 est un format legacy. Pour les nouveaux projets, utilisez CUID2.
Qu'est-ce que CUID ?
CUID (Collision-Resistant Unique Identifier) est un algorithme open-source pour générer des identifiants uniques qui fonctionnent bien dans les systèmes distribués sans coordinateur central. Contrairement à un UUID simple, un CUID est conçu pour être horizontalement évolutif — plusieurs serveurs ou onglets de navigateur peuvent chacun générer des identifiants indépendamment avec un risque minimal de collision.
Chaque CUID commence par la lettre minuscule c, rendant le format immédiatement reconnaissable d'un coup d'œil. Les caractères restants sont tous des caractères alphanumériques minuscules (base36), donc un CUID est sûr pour les URL et peut être utilisé directement comme segment de chemin URL ou clé primaire de base de données sans encodage supplémentaire.
La spécification CUID originale (v1) a été créée par Eric Elliott et popularisée via le package npm cuid. Elle est maintenant remplacée par CUID v2, qui fournit une sécurité cryptographique. Cette page — et le générateur ci-dessus — produit des identifiants CUID v1, le format classique encore largement rencontré dans les bases de code en production.
Structure de CUID
Un CUID v1 fait environ 25 caractères de long et est composé de cinq segments concaténés, chacun portant un type différent d'entropie :
Les segments sont simplement concaténés — il n'y a pas de séparateurs. La longueur totale varie légèrement selon la valeur actuelle de l'horodatage mais reste à environ 25 caractères.
Comment CUID Prévient les Collisions
La résistance aux collisions provient de la superposition de sources d'entropie indépendantes de sorte que même dans les scénarios les plus défavorables (des milliers d'identifiants générés par milliseconde sur de nombreuses machines) la probabilité de deux identifiants identiques reste infiniment faible.
CUID vs UUID v4
CUID et UUID v4 sont tous deux largement utilisés pour la génération d'identifiants côté client. Ils adoptent des approches différentes au même problème :
| Caractéristique | CUID v1 | UUID v4 |
|---|---|---|
| Format | c + base36 (~25 chars) | groupes hex (36 chars avec tirets) |
| Triable | Approximativement (préfixe horodatage) | Non |
| Sûr pour URL | Oui (alphanumérique uniquement) | Principalement (les tirets sont valides dans les URL) |
| Résistance aux collisions | Élevée — horodatage + compteur + empreinte + aléatoire | Élevée — 122 bits aléatoires |
| Prévisibilité | Partiellement (horodatage visible) | Aucune (purement aléatoire) |
| Longueur | ~25 caractères | 36 caractères |
| Nécessite une coordination | Non | Non |
UUID v4 est le choix le plus sûr pour les scénarios sensibles à la sécurité car il ne révèle aucune information de timing. CUID a l'avantage lorsque vous voulez des identifiants vaguement triables, plus courts et sans tirets — pratique pour une utilisation dans des URL, des noms de fichier ou des journaux où vous voulez identifier rapidement quand un enregistrement a été créé.
CUID v1 vs CUID2
La spécification CUID a été révisée de manière significative. Comprendre les différences vous aide à choisir la bonne version pour votre projet :
| Aspect | CUID v1 | CUID v2 |
|---|---|---|
| Algorithme | Composants déterministes | Basé sur SHA-3, entièrement opaque |
| Cryptographique | Non | Oui |
| Horodatage visible | Oui | Non |
| Format | Commence par "c" | Commence par "c" (configurable) |
| Package npm | @paralleldrive/cuid (obsolète) | @paralleldrive/cuid2 |
| Longueur | ~25 chars | 24 chars (par défaut, configurable) |
Pour les nouveaux projets, CUID v2 est le choix recommandé. Sa construction basée sur SHA-3 signifie que la sortie est opaque — aucun horodatage, compteur ou empreinte ne peut être récupéré par rétro-ingénierie depuis l'identifiant. Utilisez CUID v1 uniquement lorsque vous avez besoin de compatibilité ascendante avec un ensemble de données existant ou que vous souhaitez une implémentation sans dépendances.
Cas d'Utilisation
@id par défaut pour les clés primaires String — @default(cuid()) — en faisant l'un des formats d'identifiants les plus largement déployés dans l'écosystème JavaScript.Exemples de Code
Installez le package officiel CUID v2 (recommandé) ou écrivez une implémentation minimale de v1 sans dépendances :
// 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'Si vous préférez une implémentation Node.js sans dépendances de l'algorithme 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'Utilisation de CUID comme clé primaire de base de données avec Prisma et 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())
}