
UUID, ULID, Nanoid : quel identifiant unique choisir en 2026 ?
UUID v4 aléatoire, UUID v7 et ULID triables par date, Nanoid compact : comparatif et générateurs en ligne pour clés primaires et IDs publics.
Un identifiant aléatoire, triable ou compact : trois besoins différents
Un simple auto-increment expose le volume de lignes d'une table, se coordonne mal entre plusieurs serveurs qui écrivent en même temps, et se devine (l'ID 1042 laisse supposer qu'il existe un ID 1041). D'où l'intérêt d'un identifiant généré côté client ou côté serveur sans compteur central. Mais « unique et imprévisible » ne veut pas dire la même chose selon le format choisi. Le générateur UUID produit un UUID v4 purement aléatoire, un UUID v7 dont les premiers bits encodent un horodatage (donc triable), ou le UUID nil de test. Le générateur ULID vise le même objectif que l'UUID v7 — un identifiant triable par date de création — avec une écriture plus courte en Base32. Le générateur Nanoid abandonne l'horodatage intégré pour optimiser la longueur de la chaîne à budget d'entropie donné. Les trois tournent entièrement dans le navigateur et sont regroupés sur le hub des outils utilitaires pour développeurs, à côté du testeur de regex et du générateur de mot de passe.
Choisir le bon outil selon le contexte
Prototypage, tests, et vérifications visuelles avant d'écrire la moindre ligne de code serveur.
Le générateur en ligne prototype le format ; il ne remplace pas la génération en production.
Les pièges qui coûtent cher une fois en production
Une clé primaire alimentée par des UUID v4 insère chaque nouvelle ligne à une position aléatoire dans l'index B-tree, ce qui fragmente les pages et ralentit les écritures sur une table à fort volume. Ce n'est pas un problème d'UUID en général, c'est un problème d'aléatoire pur : un UUID v7 (RFC 9562) encode un horodatage en millisecondes sur les 48 premiers bits puis complète en aléatoire, et un ULID fait la même chose en Base32. Les deux s'insèrent en fin d'index, comme un auto-increment, sans révéler de compteur exploitable. Le générateur UUID passe de v4 à v7 sans changer la forme du champ (36 caractères avec tirets) ; le générateur ULID propose l'alternative en 26 caractères.
Remplacer un auto-increment par un UUID, un ULID ou un Nanoid empêche l'énumération triviale (essayer ?id=124, puis 125…) mais ne vérifie l'autorisation de personne : un identifiant obtenu par un autre canal (lien partagé, log, en-tête referrer) reste lisible si l'API ne contrôle pas la propriété de la ressource. Un ULID pose un problème supplémentaire : ses 10 premiers caractères encodent en clair l'horodatage de création. Ce n'est pas gênant pour une clé primaire, mais c'en est un pour un jeton censé rester opaque — quiconque connaît approximativement la date de création réduit d'autant l'espace à explorer avant même d'attaquer la partie aléatoire.
La résistance aux collisions d'un Nanoid dépend entièrement du produit taille × alphabet. Le réglage par défaut de l'outil (21 caractères sur l'alphabet url à 64 symboles) vise une probabilité de collision comparable à celle d'un UUID v4 pour un rythme de génération réaliste — mais chaque préréglage modifie ce calcul. Passer sur l'alphabet « numeric » (10 symboles) ou descendre à une taille de 6-8 caractères pour un slug plus court peut réduire l'espace d'identifiants de plusieurs ordres de grandeur sans que rien ne le signale, sauf le compteur d'entropie affiché en direct à côté du champ taille.
Le sélecteur de format de l'outil UUID (brut, accolades, urn:uuid:) et l'interrupteur de casse changent la représentation textuelle, pas les 128 bits sous-jacents — mais une colonne qui compare des chaînes brutes ne sait pas que {550e8400-…} et urn:uuid:550e8400-… désignent le même UUID sans normalisation préalable. Même logique côté ULID : le Crockford Base32 est défini comme insensible à la casse au décodage, mais une contrainte UNIQUE sur une chaîne, elle, est sensible à la casse.
Format, taille, tri : ce qui distingue vraiment les quatre variantes
Même objectif — l'unicité sans coordinateur central — quatre formats différents.
Les options exposées par chaque outil, telles qu'elles existent aujourd'hui.
Trois situations concrètes où le choix du format a un impact mesurable.
Générer, ajuster, copier
Sur le générateur UUID, la liste se met à jour dès que vous changez une option — il n'y a pas de bouton « générer » séparé. Sur le générateur ULID, l'horodatage décodé de chaque ID apparaît directement sous la ligne générée.
Étape 1 — Choisir la version ou l'option de tri
UUID : v4 pour de l'aléatoire pur, v7 pour du triable, nil pour l'UUID zéro de test (le compteur est alors forcé à 1). ULID : activez le mode monotone si vous générez plusieurs ID dans la même milliseconde et voulez un ordre garanti.
Étape 2 — Ajuster tirets, casse et format
Sur UUID, choisir le format urn:uuid: fige automatiquement les tirets et désactive l'interrupteur de casse. Sur ULID, les majuscules sont activées par défaut ; le décodage Crockford Base32 reste correct même en minuscule.
Étape 3 — Régler le nombre d'ID (1 à 50) puis copier
Copiez toute la liste d'un coup, téléchargez-la en .txt, ou copiez une ligne à la fois avec le bouton dédié à chaque ID.
Le générateur Nanoid affiche l'entropie en bits en direct dès que vous changez la taille ou l'alphabet, pour ne pas avoir à la recalculer de tête.
Les mêmes formats côté serveur, en Node
Node expose crypto.randomUUID() nativement pour un UUID v4, sans dépendance. Le module crypto intégré ne génère pas de v7 : il faut passer par un petit paquet npm comme uuid pour la variante triable.
Exemple de base
Node n'a pas d'implémentation ULID native. Le paquet ulid expose la génération et le décodage de l'horodatage intégré.
Exemple de base
Le paquet nanoid reproduit l'alphabet url et la taille par défaut de l'outil (21 caractères), avec customAlphabet pour un alphabet ou une taille sur mesure.
Exemple de base
Pas d'installation, pas d'envoi de données, jusqu'à 50 ID par lot, options de format complètes pour les trois formats. Contrepartie : pas de génération à fort débit côté navigateur, pas de garantie de monotonie entre plusieurs onglets ou processus, et un alphabet Nanoid personnalisé plafonné à 256 caractères. Utilisez les pages pour prototyper un schéma ou produire des fixtures ; gardez uuid, ulid et nanoid côté serveur pour la production.
Conclusion
Il n'y a pas un identifiant « meilleur » dans l'absolu. UUID v4 reste le bon choix pour un identifiant purement opaque, sans contrainte de tri, avec le support natif le plus large. UUID v7 ou ULID prennent le relais dès que l'ordre d'insertion compte pour la performance d'un index ou pour un tri applicatif sans colonne created_at dédiée. Nanoid vise la chaîne la plus courte possible à budget d'entropie donné, en particulier dans une URL. Aucun des trois ne remplace un contrôle d'autorisation côté serveur, et aucun n'est fait pour une génération à fort débit dans le navigateur — c'est le rôle des bibliothèques uuid, ulid et nanoid côté serveur. Si ces identifiants transitent dans une charge JSON d'API, le guide sur l'optimisation d'une API REST JSON complète cette lecture, tout comme le validateur de schéma JSON pour vérifier le format attendu d'un champ id.
Articles connexes

Calculez MD5, SHA ou un HMAC dans le navigateur. Hex, Base64 ou Base64URL — checksum de texte et signature de webhook, 100 % local.

Évitez SSH et nginx pour un side project Next.js. Comparez Railway, Render, Vercel et un VPS, puis déployez depuis Git après avoir minifié les assets dans le navigateur.

Convertir du texte, un fichier ou une image en Base64 (et inversement) sans backend — data URI CSS, pièce jointe email, payload JWT. 100 % local.