
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 répond à trois besoins différents
Un identifiant auto-incrémenté révèle le nombre de lignes d'une table. Il se coordonne mal entre plusieurs serveurs qui écrivent en même temps, et il se devine (l'ID 1042 laisse supposer qu'un ID 1041 existe). D'où l'intérêt d'un identifiant créé côté client ou côté serveur, sans compteur central. Mais « unique et imprévisible » ne veut pas dire la même chose d'un format à l'autre. Le générateur UUID produit un UUID v4 aléatoire, un UUID v7 qui commence par un horodatage, ou l'UUID nil pour les tests. Le générateur ULID poursuit le même but que l'UUID v7, un identifiant triable par date de création, dans une chaîne Base32 plus courte. Le générateur Nanoid se passe d'horodatage : tous ses caractères sont aléatoires, d'où une chaîne plus courte à entropie égale. Les trois tournent dans le navigateur. Ils sont regroupés sur le hub des outils utilitaires pour développeurs, avec le testeur de regex et le 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.
uuid, ulid, nanoid sous Node) évite tout passage par le navigateurLes pièges qui coûtent cher une fois en production
Une clé primaire remplie d'UUID v4 insère chaque nouvelle ligne à une place aléatoire de l'index en arbre B. Sur une table très sollicitée, les pages se fragmentent et les écritures ralentissent. La cause est le tirage purement aléatoire, pas l'UUID en soi. Un UUID v7 (RFC 9562) place un horodatage en millisecondes dans ses 48 premiers bits et complète par des bits aléatoires. Un ULID applique la même idée en Base32. Les nouvelles valeurs arrivent alors en fin d'index, comme avec une clé auto-incrémentée, sans révéler de compteur exploitable. La RFC 9562 note que l'écart peut atteindre un ordre de grandeur, voire plus. 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 la variante plus courte, en 26 caractères.
Remplacer une clé auto-incrémentée par un UUID, un ULID ou un Nanoid empêche l'énumération simple (essayer ?id=124, puis 125…). Il ne remplace pas pour autant un contrôle d'autorisation. Un identifiant obtenu ailleurs (lien partagé, ligne de journal, en-tête Referer) reste lisible si l'API ne vérifie pas à qui appartient la ressource. Un ULID pose un problème de plus. Ses 10 premiers caractères donnent la date de création en clair. Pour une clé primaire, c'est sans conséquence. Pour un jeton censé rester opaque, c'est un défaut : qui connaît à peu près la date de création réduit l'espace à explorer avant même d'attaquer la partie aléatoire.
La résistance aux collisions d'un Nanoid dépend à la fois de la taille et de l'alphabet. Le réglage par défaut de l'outil, 21 caractères tirés de l'alphabet URL-safe de 64 symboles, porte 126 bits aléatoires, contre 122 pour un UUID v4. Tout autre réglage change ce calcul. À 8 caractères sur le même alphabet, le risque d'au moins une collision atteint 1 % vers 2,4 millions d'identifiants. L'alphabet Numérique (10 symboles) réduit lui aussi l'espace : 21 chiffres donnent environ 70 bits. Rien ne vous prévient, sauf l'entropie en bits affichée par le bouton d'information à côté du champ Taille.
Le sélecteur de format de l'outil UUID (simple, accolades, URN) et l'interrupteur des majuscules changent l'écriture, pas les 128 bits sous-jacents. Une colonne qui compare des chaînes brutes ne sait pas que {550e8400-…} et urn:uuid:550e8400-… désignent le même UUID, sauf normalisation préalable. Même piège côté ULID. Le Crockford Base32 ignore la casse au décodage, mais une contrainte UNIQUE sur une colonne de texte en tient souvent compte, comme PostgreSQL par défaut.
Format, taille et tri des quatre variantes
Un même objectif, l'unicité sans coordinateur central, sous quatre formes différentes.
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 est générée à nouveau dès que vous changez une option : il n'y a pas de bouton Générer. Sur le générateur ULID, l'horodatage décodé de chaque ID apparaît juste sous sa ligne.
1. Choisir la version ou l'option Monotone
Côté UUID, v4 donne un tirage purement aléatoire, v7 un ordre par date et nil l'UUID tout à zéro, avec une quantité fixée à 1. Les v7 d'une même liste partagent en général la même milliseconde et ne sont donc pas triés entre eux. Côté ULID, tous les ID d'une liste partagent la même milliseconde et sortent dans un ordre aléatoire. Activez Monotone pour obtenir un ordre strictement croissant.
2. Ajuster tirets, casse et format
Côté UUID, le format URN impose tirets et minuscules et désactive les deux interrupteurs. Côté ULID, les majuscules sont actives par défaut ; le décodage Crockford Base32 donne le même résultat en minuscules.
3. Régler la quantité (1 à 50) puis copier
Copiez toute la liste d'un coup, téléchargez un fichier .txt ou copiez une seule ligne avec le bouton placé sur chaque ID.
Le générateur Nanoid affiche l'entropie en bits dans l'infobulle du bouton d'information placé à côté de Taille. La valeur suit chaque changement de taille ou d'alphabet : inutile de la calculer de tête.
Les mêmes formats côté serveur, en Node
Node fournit crypto.randomUUID() pour un UUID v4, sans dépendance. Depuis Node 24.16 et 26.1, crypto.randomUUIDv7() produit aussi un v7. Sur les versions plus anciennes, le petit paquet uuid se charge de la variante triable, comme dans cet exemple.
Exemple de base
Node n'a pas d'implémentation ULID native. Le paquet ulid génère des ULID et décode leur horodatage intégré.
Exemple de base
Le paquet nanoid utilise le même alphabet URL-safe et la même taille par défaut que l'outil (21 caractères). Sa fonction customAlphabet accepte un alphabet et une taille sur mesure.
Exemple de base
Pas d'installation, rien d'envoyé, jusqu'à 50 ID par liste et toutes les options de format des trois outils. En contrepartie, pas de génération à fort débit dans le navigateur ni d'ordre monotone d'une liste à l'autre ou entre onglets. Un alphabet Nanoid personnalisé est limité à 256 caractères. Servez-vous des pages pour prototyper un schéma ou produire des fixtures, et gardez uuid, ulid et nanoid côté serveur pour la production.
Conclusion
Aucun identifiant ne convient à tous les cas. 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 les performances d'un index ou pour un tri sans colonne created_at dédiée. Nanoid donne la chaîne la plus courte à entropie donnée, ce qui sert dans une URL. Aucun des trois ne remplace un contrôle d'autorisation côté serveur. Aucun n'est fait non plus pour une génération à fort débit dans le navigateur : c'est le rôle des bibliothèques serveur uuid, ulid et nanoid. Si ces identifiants transitent dans une charge JSON d'API, le guide sur l'optimisation d'une API REST JSON prolonge cette lecture. Le validateur de schéma JSON vérifie ensuite le format attendu d'un champ id.
Générer un identifiant dans le navigateur
uuid, ulid, nanoid), pas le générateur du navigateurArticles connexes

Collez un token et un JWKS pour vérifier une signature RS256, ES256 ou HS256 dans le navigateur. Choix par kid, erreurs mesurées, claims à contrôler.

HTTP/2 et HTTP/3 changent le trajet des fichiers, pas leur poids. Mesures de taille, de compilation et de bundling : ce que la minification apporte encore.

Convertissez un epoch Unix en date lisible et inversement, distinguez secondes et millisecondes, et évitez les pièges de fuseau, de JWT et de changement d’heure.