Générateur CUID2

Génère des identifiants CUID2 sécurisés de nouvelle génération

Quantité
Longueur

CUID2s générés

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

Qu'est-ce que CUID2 ?

CUID2 (Collision-resistant Unique ID, version 2) est le successeur de nouvelle génération de CUID v1, conçu pour générer des identifiants courts, cryptographiquement sécurisés et opaques qui sont sûrs à utiliser comme clés primaires dans les bases de données, les URL et les systèmes distribués.

Contrairement à son prédécesseur, CUID2 ne révèle aucune information sur le moment de création, la machine hôte ou le processus qui l'a généré. Chaque identifiant est une chaîne apparemment aléatoire qui commence par une lettre minuscule aléatoire suivie d'un hash base-36 dérivé de SHA-512. La longueur par défaut est de 24 caractères, mais vous pouvez la configurer de 2 à 32 caractères selon vos contraintes de stockage.

CUID2 est largement recommandé par les kits d'outils de bases de données modernes. Prisma l'a adopté comme stratégie d'identifiant par défaut pour son scalaire @default(cuid()), et PlanetScale, Neon et d'autres fournisseurs de bases de données serverless listent explicitement CUID2 comme format d'identifiant préféré car il évite les vulnérabilités de scan séquentiel des entiers auto-incrémentés tout en étant plus court et plus lisible qu'un UUID.

Pourquoi CUID2 a Remplacé CUID v1

CUID v1, sorti en 2012 par Eric Elliott, était une amélioration majeure par rapport aux UUID simples pour la génération d'identifiants côté client. Cependant, des chercheurs en sécurité ont découvert deux problèmes fondamentaux avec sa conception :

  • Fingerprinting : L'empreinte d'hôte intégrée dans chaque valeur CUID v1 pouvait être utilisée pour identifier la machine ou le processus qui a généré l'identifiant, révélant des métadonnées opérationnelles à toute personne pouvant observer les identifiants.
  • Prévisibilité : Comme CUID v1 incorporait un compteur monotoniquement croissant et un segment d'horodatage, un attaquant observant plusieurs identifiants pouvait prédire la plage approximative des futurs identifiants, permettant des attaques d'énumération contre des API utilisant les identifiants comme seul contrôle d'autorisation.
  • Hash non cryptographique : CUID v1 utilisait une étape de hash non cryptographique simple qui ne répondait pas aux normes de sécurité modernes.

Eric Elliott, l'auteur original, a formellement déprécié CUID v1 et créé CUID2 de zéro pour résoudre tous ces problèmes. Le nouvel algorithme utilise la Web Crypto API (SHA-512) et élimine tous les composants déterministes, rendant chaque identifiant statistiquement indépendant de tous les autres.

Principes de Conception de CUID2

Imprévisible
Aucun horodatage, compteur ou empreinte d'hôte n'est intégré. Chaque identifiant est généré à partir d'un nouveau sel aléatoire cryptographique combiné avec SHA-512.
Distribution plate
L'encodage base-36 du digest SHA-512 produit une distribution de caractères quasi-uniforme, réduisant les points chauds d'indexation dans les bases de données B-tree.
Sûr pour URL par défaut
L'alphabet est limité aux lettres minuscules a–z et aux chiffres 0–9 — sans tirets, soulignés ni majuscules — rendant les identifiants sûrs dans les URL sans encodage pourcentage.
Longueur configurable
Vous choisissez la longueur (2–32). Des identifiants plus courts signifient une probabilité de collision plus élevée ; la valeur par défaut recommandée de 24 donne ~4 × 10³⁷ valeurs uniques.
Commence toujours par une lettre
Le premier caractère est toujours une lettre minuscule aléatoire, garantissant que les valeurs CUID2 sont des identifiants d'éléments HTML et des sélecteurs CSS valides sans échappement.
Pas de serveur requis
CUID2 repose uniquement sur la Web Crypto API disponible dans tous les navigateurs modernes et Node.js 15+, donc les identifiants peuvent être générés côté client avec les mêmes garanties de sécurité que le serveur.

CUID2 vs CUID v1 — Comparaison

Le tableau ci-dessous résume les différences clés entre CUID2 et le maintenant obsolète CUID v1. Si vous utilisez actuellement CUID v1, la migration vers CUID2 est fortement recommandée.

AttributCUID2CUID v1
SécuritéCryptographique (SHA-512)Non cryptographique (basé sur empreinte)
PrévisibilitéOpaque — aucune métadonnée divulguéeHorodatage + empreinte visible dans l'identifiant
LongueurConfigurable (2–32 chars)Fixe 25 chars
PréfixeLettre aléatoire a–zCommence toujours par "c"
DistributionPlate / uniformeSegments monotoniquement croissants
StatutActivement maintenuDéprécié par l'auteur original

CUID2 vs UUID v4 — Comparaison

UUID v4 est le standard dominant pour les identifiants uniques aléatoires. CUID2 offre plusieurs avantages pratiques sur UUID v4 sans sacrifier la sécurité.

AttributCUID2UUID v4
Longueur par défaut24 caractères36 caractères (avec tirets)
Sûr pour URLOui — minuscules a–z + 0–9Nécessite un encodage (contient des tirets)
Longueur personnaliséeOui (2–32)Non — toujours 128 bits / 36 chars
TriableNon (par conception)Non (v4 est aléatoire)
Source d'entropieSHA-512 + Web CryptoCSPRNG
Jeu de caractèresBase-36 (a–z, 0–9)Hex + tirets

Le principal compromis est la familiarité : UUID v4 est un standard IETF (RFC 4122) reconnu par pratiquement toutes les bases de données, langages de programmation et frameworks d'API. CUID2 est un standard communautaire avec un support croissant mais pas universel. Choisissez UUID v4 lorsque l'interopérabilité avec des systèmes externes est primordiale ; choisissez CUID2 lorsque vous contrôlez les deux extrémités et préférez des identifiants plus courts et sûrs pour les URL.

Qui Utilise CUID2

CUID2 a connu une adoption rapide dans l'écosystème moderne JavaScript et TypeScript :

  • Prisma — l'ORM TypeScript le plus populaire utilise CUID2 comme défaut recommandé pour les champs @id avec @default(cuid()) dans Prisma Schema v2+.
  • PlanetScale — leur documentation et modèles de démarrage recommandent CUID2 pour les clés primaires générées par l'application afin d'éviter les problèmes de performance de scan séquentiel sur leur plateforme MySQL distribuée.
  • Drizzle ORM — fournit un helper par défaut intégré cuid2() pour les définitions de colonnes.
  • Modèles tRPC — de nombreux modèles communautaires tRPC + Prisma sont livrés avec CUID2 comme stratégie de clé primaire.
  • T3 Stack — l'outil de scaffolding create-t3-app utilise Prisma avec des valeurs par défaut CUID2 dans les fichiers de schéma générés.

Exemples de Code

Le package npm officiel @paralleldrive/cuid2 fournit une API simple :

JavaScript (npm — @paralleldrive/cuid2)
import { createId } from '@paralleldrive/cuid2'

// Generate a single CUID2 (default length: 24)
const id = createId()
console.log(id) // e.g. "tz4a98xxat96iws9zmbrgj3a"

// Custom length
import { init } from '@paralleldrive/cuid2'
const createShortId = init({ length: 16 })
const shortId = createShortId()
console.log(shortId) // e.g. "tz4a98xxat96iws9"

Utilisation de CUID2 avec le schéma Prisma :

Prisma Schema
model User {
  id        String   @id @default(cuid())
  email     String   @unique
  name      String?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

Génération de CUID2 dans Node.js sans le package npm (en utilisant uniquement la Web Crypto API, comme le fait cet outil dans le navigateur) :

Node.js (Web Crypto — no dependencies)
async function generateCuid2(length = 24) {
  const alphabet = 'abcdefghijklmnopqrstuvwxyz'

  // Random prefix letter
  const firstByte = crypto.getRandomValues(new Uint8Array(1))[0]
  const firstChar = alphabet[firstByte % 26]

  // Random 32-byte salt
  const salt = crypto.getRandomValues(new Uint8Array(32))
  const saltHex = [...salt].map(b => b.toString(16).padStart(2, '0')).join('')

  // SHA-512 of timestamp + salt
  const input = Date.now().toString(36) + saltHex
  const hashBuffer = await crypto.subtle.digest(
    'SHA-512',
    new TextEncoder().encode(input)
  )

  // Encode hash bytes as base-36 string
  const bytes = new Uint8Array(hashBuffer)
  let hash = ''
  for (let i = 0; i < bytes.length; i += 8) {
    let chunk = 0n
    for (let j = 0; j < 8 && i + j < bytes.length; j++) {
      chunk = (chunk << 8n) | BigInt(bytes[i + j])
    }
    hash += chunk.toString(36)
  }

  return (firstChar + hash).slice(0, length)
}

// Usage
const id = await generateCuid2()
console.log(id) // e.g. "m7k3r9p2nxq8zt5a6cwj4bvd"

Questions Fréquemment Posées

CUID2 est-il compatible avec les versions antérieures de CUID v1 ?
Non. Les identifiants CUID2 sont complètement différents des identifiants CUID v1. CUID v1 commence toujours par la lettre "c" et a une longueur fixe de 25 caractères. CUID2 commence par une lettre aléatoire et a une longueur configurable (24 par défaut). Si vous migrez une base de données existante, vous devrez gérer les deux formats ou exécuter une migration pour remplacer toutes les valeurs CUID v1.
Quelle longueur dois-je utiliser ?
La valeur par défaut de 24 caractères est le choix recommandé pour la plupart des applications. Elle fournit environ 4 × 10³⁷ valeurs uniques, rendant les collisions statistiquement impossibles même à grande échelle. Utilisez 16 caractères si le stockage est critique et que votre ensemble de données contient moins de quelques milliards d'enregistrements. Utilisez 32 caractères pour la marge de sécurité maximale.
CUID2 est-il triable par temps de création ?
Non — et c'est intentionnel. CUID2 écarte délibérément toutes les informations temporelles pour prévenir les attaques d'énumération et le fingerprinting. Si vous avez besoin d'identifiants ordonnés dans le temps, considérez ULID ou UUID v7 à la place. CUID2 échange la triabilité contre la sécurité et l'opacité.
CUID2 vs NanoID — lequel choisir ?
Les deux sont sécurisés et sûrs pour les URL. NanoID est légèrement plus court avec 21 caractères par défaut et utilise un alphabet plus grand (A–Za–z0–9_-) donnant plus d'entropie par caractère. CUID2 utilise un alphabet restreint (a–z, 0–9) plus sûr dans les sélecteurs CSS et commence toujours par une lettre. Choisissez NanoID si vous voulez la densité d'entropie maximale ; choisissez CUID2 si l'intégration Prisma/ORM ou les identifiants sûrs pour CSS sont importants.
CUID2 est-il sûr pour les URL ?
Oui. CUID2 n'utilise que des lettres minuscules (a–z) et des chiffres (0–9). Il ne contient pas de tirets, soulignés, signes plus, barres obliques ni signes égal, donc il peut être intégré directement dans des URL, des attributs id HTML, des sélecteurs CSS et des noms de fichier sans aucun encodage.
Puis-je utiliser CUID2 comme clé primaire de base de données ?
Oui, et c'est l'un des cas d'utilisation principaux. CUID2 évite le modèle séquentiel des entiers auto-incrémentés (qui peuvent révéler le nombre de lignes et permettre l'énumération), est plus court qu'un UUID (économisant l'espace d'index) et est sûr pour les URL. La plupart des bases de données le stockent comme colonne VARCHAR(24) ou TEXT. Notez que contrairement aux ULID ou UUID v7, les valeurs CUID2 ne sont pas ordonnées dans le temps, donc si vos requêtes dépendent fortement des scans dans l'ordre d'insertion, vous préférerez peut-être une alternative triable.