Générateur CUID

Génère des IDs uniques résistants aux collisions (CUID v1)

Quantité

CUIDs générés

Cliquez sur Générer pour créer des CUIDs

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 :

Exemple: clrc4gkwz001ag2hs3k7f9m2q
cpréfixeToujours la lettre "c" — identifie un CUID
lrc4gkwzhorodatageHorodatage en millisecondes en base36 (~8 chars)
001acompteurCompteur base36 de 4 chars — évite les collisions dans la même milliseconde
g2hsempreinteEmpreinte d'hôte base36 de 4 chars (info navigateur/environnement)
3k7f9m2qaléatoireBloc aléatoire base36 de 8 chars — deux valeurs 32 bits

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.

Horodatage en Millisecondes
Le premier segment encode le temps actuel en base36. Les identifiants générés à des moments différents se trient automatiquement lexicographiquement par temps de création — utile pour la pagination et le débogage.
Compteur Monotonique
Au sein du même processus, le compteur de 4 chars s'incrémente à chaque identifiant généré. Même si deux appels se produisent dans la même milliseconde sur la même machine, le compteur garantit l'unicité pour jusqu'à 65 536 identifiants par milliseconde.
Empreinte de Machine
Un hash dérivé de données spécifiques à l'environnement (ID de processus + nom d'hôte dans Node.js ; dimensions d'écran + informations du navigateur dans le navigateur). Cela différencie les identifiants générés sur des hôtes séparés au même milliseconde exact avec la même valeur de compteur.
Bloc Aléatoire
Les 8 derniers caractères proviennent de deux valeurs aléatoires 32 bits indépendantes encodées en base36. Cela ajoute une couche finale d'entropie qui protège contre les collisions même si l'empreinte de deux machines produit le même hash.

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éristiqueCUID v1UUID v4
Formatc + base36 (~25 chars)groupes hex (36 chars avec tirets)
TriableApproximativement (préfixe horodatage)Non
Sûr pour URLOui (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ères36 caractères
Nécessite une coordinationNonNon

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 :

AspectCUID v1CUID v2
AlgorithmeComposants déterministesBasé sur SHA-3, entièrement opaque
CryptographiqueNonOui
Horodatage visibleOuiNon
FormatCommence par "c"Commence par "c" (configurable)
Package npm@paralleldrive/cuid (obsolète)@paralleldrive/cuid2
Longueur~25 chars24 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

Bases de Données Distribuées
Plusieurs shards de base de données ou microservices peuvent chacun générer des clés primaires indépendamment sans table de séquences ou service d'identifiants central, éliminant un point unique de défaillance.
Génération d'Identifiants Côté Client
Un navigateur peut attribuer un CUID à un nouvel enregistrement avant de l'envoyer au serveur, permettant des mises à jour optimistes de l'interface utilisateur et éliminant l'aller-retour nécessaire pour récupérer un identifiant assigné par le serveur.
Applications Offline-First
Les applications mobiles ou PWA qui fonctionnent sans connectivité peuvent créer des enregistrements avec des identifiants stables qui survivent à la synchronisation — sans conflits lorsque l'appareil se reconnecte.
Slugs d'URL
Les CUID ne contiennent que des caractères alphanumériques, les rendant sûrs pour être intégrés directement dans des chemins URL sans encodage pourcentage. Le préfixe horodatage ajoute un ordre approximatif par temps de création.
Corrélation d'Événements / Journaux
Comme l'horodatage est encodé dans le premier segment, les entrées de journal marquées avec des CUID peuvent être grossièrement triées par temps de création même à travers des agrégateurs de journaux distribués.
ORM / Défaut de Prisma
Prisma utilise CUID comme stratégie @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 :

JavaScript / TypeScript
// 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 :

Node.js (no dependencies)
// 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 :

Prisma / SQL
-- 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())
}

Questions Fréquemment Posées

CUID est-il sûr pour les URL ?
Oui. CUID v1 n'utilise que des lettres minuscules et des chiffres (encodage base36), qui sont tous des caractères sûrs pour les URL. Aucun encodage pourcentage n'est nécessaire lors de l'utilisation d'un CUID dans un chemin URL ou un paramètre de requête.
CUID est-il cryptographiquement sécurisé ?
Non. CUID v1 utilise Math.random() et expose un préfixe d'horodatage visible. Il n'est pas adapté aux fins sensibles à la sécurité comme les jetons de session ou les liens de réinitialisation de mot de passe. Pour ces cas d'utilisation, utilisez crypto.randomUUID() ou CUID v2.
CUID vs NanoID — lequel choisir ?
NanoID est cryptographiquement sécurisé, plus court (21 chars par défaut) et utilise un alphabet personnalisable. Choisissez NanoID quand la sécurité est importante ou quand vous avez besoin d'un identifiant plus court. Choisissez CUID quand vous voulez un identifiant grossièrement triable avec préfixe horodatage qui soit débogable par les humains.
Dois-je utiliser CUID v1 ou CUID v2 ?
CUID v2 est la recommandation actuelle. Il est cryptographiquement sécurisé, ne fuit pas d'informations de timing et est activement maintenu. CUID v1 est utile lorsque vous avez besoin d'une implémentation simple sans dépendances ou que vous maintenez un système hérité. Ce générateur produit des identifiants CUID v1.
CUID vs ULID — quelle est la différence ?
Les deux ont un préfixe horodatage et sont triables lexicographiquement. ULID utilise Crockford base32 (128 bits au total, 48 bits horodatage + 80 bits aléatoires), le rendant légèrement plus aléatoire. CUID ajoute une empreinte de machine et un compteur monotonique, ce qui améliore la résistance aux collisions sur le même hôte dans la même milliseconde. ULID trie de manière plus fiable car l'horodatage occupe la portion d'ordre supérieur complète.
CUID est-il garanti d'être unique ?
Aucun schéma d'identifiant ne peut donner une garantie mathématique sans coordinateur central. CUID rend les collisions extrêmement improbables en combinant quatre sources d'entropie indépendantes : l'horodatage, un compteur par processus, une empreinte de machine et des données aléatoires. En pratique, les collisions sont bien moins probables qu'une défaillance matérielle.