Skip to content

Générateur ULID gratuit — Générer & décoder des ULID

Générez, décodez et convertissez des ULID en ligne — gratuit, 100 % dans votre navigateur. Extrayez l'horodatage intégré, convertissez ULID en UUID et inversement, par lots, avec mode monotone. Rien n'est envoyé à un serveur.

Sans pistage Fonctionne dans le navigateur Gratuit
Chaque ULID est généré localement avec le RNG cryptographique de votre navigateur (crypto.getRandomValues). Rien n'est téléversé, journalisé ni stocké.

Chaque ULID utilise un aléa neuf de 80 bits.

Qu'est-ce qu'un ULID ?

Un ULID — Universally Unique Lexicographically Sortable Identifier — est un identifiant de 128 bits créé pour corriger une faiblesse pratique de l'UUIDv4 aléatoire tout en conservant sa meilleure propriété : vous pouvez en générer un n'importe où, sans coordinateur central, et avoir la certitude qu'il est unique. La différence, c'est qu'un ULID est triable par le temps. Il est rendu sous forme de 26 caractères en Base32 de Crockford, scindés en deux parties : les 10 premiers caractères sont un horodatage de 48 bits comptant les millisecondes depuis l'époque Unix, et les 16 derniers caractères sont 80 bits d'aléa cryptographiquement sûr. Mettez le temps en premier, encodez-le dans un alphabet qui préserve l'ordre, et l'identifiant se trie chronologiquement comme une simple chaîne.

Ce seul choix de conception a des conséquences démesurées pour les bases de données. Une clé primaire UUIDv4 aléatoire atterrit à un endroit imprévisible d'un index B-tree à chaque insertion, ce qui fragmente l'index, malmène le cache et dégrade lentement les performances d'écriture à mesure qu'une table grossit. Un ULID, parce qu'il est préfixé par le temps, atterrit à chaque fois à la fin de l'index ou à proximité — les insertions restent séquentielles, l'index reste compact, et les balayages de plage sur une fenêtre temporelle deviennent peu coûteux. Vous obtenez la génération sans coordination d'un UUID et la localité d'insertion d'un entier auto-incrémenté, sans exposer un compteur séquentiel devinable.

Les détails de l'encodage sont délibérés. Le Base32 de Crockford exclut les lettres I, L, O et U, à la fois pour éviter la confusion visuelle avec les chiffres 1 et 0 et pour rendre la chaîne insensible à la casse en entrée. Le résultat, ce sont 26 caractères sans tirets que l'on peut déposer dans une URL, un nom de fichier ou un en-tête de requête sans échappement — nettement plus courts que la forme de 36 caractères avec tirets d'un UUID. L'horodatage de 48 bits n'arrive pas à court avant longtemps : il peut représenter des dates jusqu'à l'an 10889 avant que le compteur de millisecondes ne déborde.

Les ULID ne sont pas l'outil adapté à tout. L'horodatage intégré révèle quand un enregistrement a été créé, ce qui est un atout pour le débogage et l'ordonnancement mais une petite fuite d'information si vous préférez ne pas l'exposer. Et si votre pile est engagée sur le type UUID, vous préférerez peut-être l'UUIDv7, qui applique la même idée de préfixe temporel au sein du format UUID standard. Mais lorsque vous voulez des identifiants courts, compatibles URL et triables que vous pouvez créer sur n'importe quel nœud et dont vous pouvez relire un horodatage, un ULID est une excellente valeur par défaut — et comme il ne fait que 128 bits, vous pouvez toujours le convertir vers et depuis un UUID avec l'onglet Convertir de cet outil.

// Browser / Node with the `ulid` package
import { ulid, decodeTime } from 'ulid';

const id = ulid();          // e.g. 01KVT0F720ZK9N4T2QX7VR8WMC
const ts = decodeTime(id);  // 1782210600000  ->  2026-06-23T10:30:00.000Z

// Monotonic factory: strictly increasing within the same millisecond
import { monotonicFactory } from 'ulid';
const next = monotonicFactory();
next(1782210600000); // 01KVT0F720ZK9N4T2QX7VR8WMC
next(1782210600000); // 01KVT0F720ZK9N4T2QX7VR8WMD
next(1782210600000); // 01KVT0F720ZK9N4T2QX7VR8WME

Fonctionnalités clés

Générer, décoder et convertir sur une seule page

Trois onglets couvrent tout le flux de travail ULID : créer de nouveaux ULID, en décoder un existant pour lire son horodatage, et convertir sans perte entre ULID et UUID. La plupart des outils concurrents ne font que le premier ; ici, l'aller-retour complet tient sur une seule page.

Décodeur d'horodatage

Collez n'importe quel ULID et lisez la milliseconde exacte de sa création — affichée en UTC, en heure locale et en millisecondes Unix brutes — ainsi que le segment d'aléa de 80 bits. Vérifiez quand un identifiant a été créé sans aucune requête en base de données.

Conversion ULID ↔ UUID sans perte

Un ULID et un UUID font tous deux 128 bits, donc la conversion est exacte et réversible. L'onglet Convertir détecte automatiquement le format collé et produit l'autre, vous permettant de relier un ULID triable à une colonne ou une API typée UUID sans perdre le moindre bit.

Mode monotone

Besoin d'un ordre strict même pour des identifiants créés dans la même milliseconde ? Le mode monotone incrémente l'aléa pour que chaque ULID soit garanti supérieur au précédent, gardant une boucle d'insertion serrée parfaitement triée.

Génération par lots

Créez jusqu'à 50 ULID à la fois et copiez l'ensemble avec Tout copier. Idéal pour amorcer des fixtures de test, des insertions en masse ou remplir une table de référence sans cliquer cinquante fois.

Horodatage personnalisé

Intégrez un instant précis au lieu de l'heure actuelle — utile pour des données de test déterministes ou pour antidater des enregistrements lors d'une migration tout en préservant la propriété de tri.

Aléa cryptographiquement sûr

Les 80 bits aléatoires proviennent de crypto.getRandomValues, le CSPRNG du navigateur — jamais Math.random — donc chaque ULID est imprévisible et les collisions au sein d'une même milliseconde sont extrêmement improbables.

100 % privé, navigateur uniquement

Chaque ULID est généré, décodé et converti entièrement sur votre appareil. Aucune requête réseau, aucune journalisation, aucun stockage — vérifiez-le vous-même dans Outils de développement → Réseau. Les identifiants n'atteignent jamais un tiers.

Exemples de ULID

Générer un seul ULID

Mode : Standard · Quantité : 1
01KVT0F720ZK9N4T2QX7VR8WMC

Un ULID compte 26 caractères en Base32 de Crockford. Les 10 premiers caractères encodent un horodatage de 48 bits en millisecondes et les 16 derniers encodent 80 bits d'aléa cryptographiquement sûr tiré de crypto.getRandomValues. Comme l'horodatage vient en premier et que le Base32 préserve l'ordre des octets, les ULID générés plus tard se trient toujours après les précédents en tant que simples chaînes — aucun index séparé n'est nécessaire. Cliquez sur Copier pour récupérer la valeur ; cliquez de nouveau sur Générer pour en obtenir un neuf.

Décoder un ULID pour lire son horodatage

01ARYZ6S41TSV4RRFFQ69G5FAV
Horodatage (UTC) : 2016-07-30T22:36:16.385Z · Aléa : TSV4RRFFQ69G5FAV

Le décodage reconvertit les 10 premiers caractères en la valeur de 48 bits en millisecondes intégrée au moment de la création — ici 1469918176385 ms, soit 2016-07-30T22:36:16.385Z. C'est l'exemple canonique de la spécification ULID. L'onglet Décoder affiche l'horodatage en UTC et en heure locale, les millisecondes Unix brutes, ainsi que le segment d'aléa de 80 bits, pour que vous puissiez vérifier exactement quand un identifiant a été créé sans aucune requête en base de données.

Convertir un ULID en UUID

01KVT0F720ZK9N4T2QX7VR8WMC
019ef407-9c40-fcd3-5268-57e9f784728c

Un ULID et un UUID font tous deux exactement 128 bits, donc la conversion est sans perte et entièrement réversible — les mêmes bits sont simplement réencodés du Base32 de Crockford vers l'hexadécimal avec tirets. L'onglet Convertir détecte automatiquement si vous avez collé un ULID ou un UUID et le convertit dans l'autre forme. Vous pouvez ainsi stocker des ULID dans une colonne UUID ou transmettre un ULID à un système qui ne comprend que l'UUID, puis reconvertir lorsque vous avez de nouveau besoin de la chaîne triable.

Générer par lots des ULID monotones

Mode : Monotone · Quantité : 3 (même milliseconde)
01KVT0F720ZK9N4T2QX7VR8WMC
01KVT0F720ZK9N4T2QX7VR8WMD
01KVT0F720ZK9N4T2QX7VR8WME

Quand de nombreux identifiants sont créés dans la même milliseconde, les ULID ordinaires partagent le préfixe temporel de 10 caractères mais leurs suffixes aléatoires sont désordonnés. Le mode monotone corrige cela : au sein d'une même milliseconde, il incrémente l'aléa précédent de un, de sorte que chaque ULID est strictement supérieur au précédent et qu'un lot reste parfaitement trié. Remarquez que les trois valeurs ne diffèrent que par le caractère final (C, D, E) — idéal pour les insertions à haut débit où l'ordre doit tenir même à des cadences inférieures à la milliseconde.

Générer un ULID pour une date précise

Heure personnalisée : 2026-06-23 10:30:00 UTC
01KVT0F720… (composant temporel 01KVT0F720)

Définissez un horodatage personnalisé et le générateur intègre cet instant exact au lieu de l'heure actuelle, tout en remplissant l'aléa depuis un RNG sûr. Le composant temporel de 10 caractères pour 2026-06-23T10:30:00.000Z est 01KVT0F720. C'est utile pour amorcer des fixtures de test avec des identifiants déterministes et ordonnés dans le temps, ou pour antidater des enregistrements lors d'une migration tout en préservant la propriété de tri.

Comment utiliser le générateur ULID

  1. 1

    Choisissez un mode de génération

    Le mode Standard donne à chaque ULID un aléa neuf de 80 bits. Le mode Monotone garantit que les ULID créés dans la même milliseconde sont strictement croissants — choisissez-le pour les insertions à haut débit où l'ordre doit tenir même à des cadences inférieures à la milliseconde.

  2. 2

    Définissez quantité, casse et (éventuellement) une heure personnalisée

    Générez de 1 à 50 ULID à la fois. La sortie est en MAJUSCULES par défaut — la forme canonique du ULID — ou passez en minuscules. Laissez l'heure vide pour horodater l'instant présent, ou définissez un horodatage personnalisé pour intégrer un instant précis, utile pour des fixtures ou des enregistrements antidatés.

  3. 3

    Générez et copiez

    Cliquez sur Générer ULID. Utilisez Copier sur une seule valeur, ou Tout copier pour récupérer l'ensemble du lot sous forme de texte séparé par des sauts de ligne, prêt à coller dans du code, un fichier d'amorçage ou un tableur.

  4. 4

    Décodez un ULID pour lire son horodatage

    Dans l'onglet Décoder, collez n'importe quel ULID pour extraire l'horodatage de création de 48 bits en UTC et en heure locale, les millisecondes Unix brutes et l'aléa de 80 bits — entièrement dans votre navigateur, sans aucune requête.

  5. 5

    Convertissez entre ULID et UUID

    Dans l'onglet ULID ↔ UUID, collez un ULID ou un UUID ; l'outil détecte automatiquement l'entrée et la convertit sans perte dans l'autre format. Stockez des ULID dans des colonnes UUID, ou transmettez un ULID à un système qui n'accepte que l'UUID et reconvertissez quand vous avez besoin de la chaîne triable.

Common Errors

Considérer comme ordonnés des ULID de la même milliseconde

Les ULID ordinaires créés dans une même milliseconde partagent le préfixe temporel mais ont des suffixes aléatoires désordonnés, donc leur ordre relatif est indéfini. Si vous dépendez d'un ordre strict à cette cadence, utilisez plutôt le mode monotone.

✗ Incorrect
Mode standard, 3 identifiants dans 1 ms  →  l'ordre dans la ms est aléatoire
✓ Correct
Mode monotone, 3 identifiants dans 1 ms  →  …WMC < …WMD < …WME

Attendre qu'un ULID converti soit un UUIDv4 valide

Convertir un ULID en forme UUID réencode les mêmes 128 bits ; cela ne définit pas les champs de version et de variante de l'UUID. Le résultat est une chaîne UUID de 128 bits valide mais ne sera pas signalé comme version 4 ou 7 si une bibliothèque inspecte ces bits.

✗ Incorrect
uuid.version(ulidToUuid(id))  →  pas 4 (les bits sont ceux du ULID)
✓ Correct
Traitez-le comme une valeur opaque de 128 bits, ou générez un vrai UUIDv7

Saisir à la main un i, l ou o minuscule dans un ULID

Le Base32 de Crockford exclut I, L, O et U. Les décodeurs mappent I et L vers 1 et O vers 0, mais taper ces lettres à la main dans un ULID est source d'erreurs. Copiez les ULID plutôt que de les retaper.

✗ Incorrect
01ARYZ6S41TSV4RRFFQ69G5FAO  →  O ambigu
✓ Correct
01ARYZ6S41TSV4RRFFQ69G5FAV  →  caractères canoniques uniquement

À quoi servent les ULID

Clés primaires de base de données qui restent triées
Utilisez des ULID comme clés primaires pour obtenir la génération sans coordination d'un UUID avec la localité d'insertion d'un entier auto-incrémenté. Comme ils sont préfixés par le temps, les nouvelles lignes s'ajoutent près de la fin d'un index B-tree au lieu de se disperser comme les UUIDv4, gardant les insertions rapides et l'index compact à mesure que la table grossit.
Systèmes distribués sans séquence centrale
Générez des identifiants sur n'importe quel nœud — service, edge worker ou client — sans compteur partagé ni coordination des collisions, tout en pouvant ensuite tout trier par date de création. Les ULID donnent aux microservices une clé unique et ordonnée sans aller-retour vers la base de données pour l'allouer.
Journaux d'événements et identifiants de messages
Marquez les événements, les lignes de journal ou les messages de file d'attente avec des ULID monotones pour qu'ils restent dans un ordre chronologique strict même lorsque beaucoup sont produits dans la même milliseconde. Balayer une plage temporelle devient une simple comparaison de chaînes.
Identifiants publics compatibles URL
Un ULID compte 26 caractères sans tirets et un alphabet compatible URL, donc il se glisse dans un chemin, un nom de fichier ou un en-tête sans échappement et est plus court qu'un UUID de 36 caractères. Décodez l'horodatage intégré plus tard pour voir quand la ressource a été créée.
Passerelle vers un système qui n'accepte que l'UUID
Vous travaillez avec une colonne de base de données ou une API qui n'accepte que les UUID ? Générez des ULID triables, convertissez-les en forme UUID pour le stockage ou le transport, et reconvertissez quand vous avez besoin de la chaîne triable compacte — la valeur de 128 bits est préservée exactement dans les deux sens.
Fixtures de test déterministes
Amorcez vos tests avec des ULID à des horodatages choisis grâce à l'option d'heure personnalisée, pour que les fixtures soient reproductibles et déjà ordonnées dans le temps. Décodez-les dans vos assertions pour vérifier l'heure de création enregistrée par votre code.

Comment fonctionnent les ULID

Disposition sur 128 bits : 48 bits de temps + 80 bits d'aléa
Un ULID fait exactement 128 bits. Les 48 bits de poids fort sont un horodatage Unix en millisecondes ; les 80 bits de poids faible sont aléatoires. Encodés en Base32 de Crockford à 5 bits par caractère, cela fait 10 caractères pour le temps et 16 pour l'aléa — 26 caractères au total. Le caractère de tête est toujours 7 ou inférieur car 48 bits ne remplissent pas le groupe supérieur de 5 bits.
Encodage Base32 de Crockford
Les ULID utilisent l'alphabet Base32 de Crockford (0–9 et A–Z, hormis I, L, O et U). Retirer ces quatre lettres évite la confusion avec les chiffres 1 et 0 et permet aux décodeurs de traiter la chaîne sans tenir compte de la casse, en mappant I et L vers 1 et O vers 0 en entrée. L'alphabet est ordonné, c'est ce qui fait que la chaîne encodée se trie de la même façon que les bits sous-jacents.
Triabilité lexicographique
Comme l'horodatage est le composant le plus significatif et que l'alphabet Base32 préserve l'ordre, comparer deux ULID comme des chaînes donne le même résultat que comparer leurs valeurs de 128 bits, ce qui donne le même résultat que comparer leurs heures de création. C'est ce qui permet à un simple ORDER BY ou tri de tableau de produire un ordre chronologique sans index supplémentaire.
Monotonie au sein d'une milliseconde
L'option monotone de la spécification ULID maintient un ordre stable pour les identifiants créés dans la même milliseconde : l'aléa du premier identifiant d'une milliseconde est généré normalement, et chaque identifiant suivant dans cette milliseconde est la valeur aléatoire précédente plus un. Cet outil l'implémente en incrémentant l'aléa de 80 bits comme un entier big-endian.
Aléa sûr via crypto.getRandomValues
Les 80 bits aléatoires sont remplis depuis crypto.getRandomValues, le CSPRNG de Web Crypto, et non Math.random. Avec 80 bits d'entropie, générer même des millions de ULID dans la même milliseconde garde la probabilité de collision négligeable.
ULID ↔ UUID est un pur réencodage
Convertir entre ULID et UUID ne change aucun bit — cela réencode les mêmes 128 bits du Base32 de Crockford vers l'hexadécimal avec tirets ou inversement. Par conséquent, l'aller-retour est exact : un ULID converti en UUID puis reconverti est identique octet par octet à l'original. Notez que les octets d'un ULID ne définissent pas les champs de version et de variante de l'UUID, donc l'UUID obtenu est une valeur de 128 bits valide mais pas un UUIDv4 ou v7 étiqueté par version.

Bonnes pratiques ULID

Utilisez le mode monotone pour les insertions à haut débit
Si votre système peut créer plus d'un identifiant par milliseconde et que vous comptez sur l'ordre, générez des ULID monotones. Les ULID ordinaires ne sont pas ordonnés au sein d'une milliseconde ; les monotones sont strictement croissants, donc un lot reste trié quelle que soit la vitesse à laquelle vous les créez.
Stockez les ULID de façon compacte
Un ULID fait 128 bits — stockez-le comme 16 octets binaires ou dans une colonne typée UUID plutôt que comme un champ texte de 26 caractères quand l'espace et la taille d'index comptent. Convertissez en chaîne Base32 uniquement aux frontières où les humains ou les URL le voient. L'onglet Convertir de cet outil vous donne la forme UUID pour le stockage.
N'oubliez pas que l'horodatage est visible
Un ULID révèle son heure de création à quiconque peut le lire. C'est excellent pour le débogage et l'ordonnancement, mais si exposer l'heure de création pose problème — par exemple dans un identifiant public — pesez cette fuite, ou utilisez un UUIDv4 entièrement aléatoire là où l'ordre n'a pas d'importance.
Générez toujours avec un CSPRNG
La garantie d'unicité dépend de l'imprévisibilité des 80 bits aléatoires. Utilisez une source cryptographiquement sûre comme crypto.getRandomValues, comme le fait cet outil — jamais Math.random, dont la prévisibilité pourrait permettre à des identifiants d'entrer en collision ou d'être devinés.
Choisissez ULID ou UUIDv7 délibérément
Les deux donnent des identifiants de 128 bits ordonnés dans le temps. Choisissez le ULID pour la chaîne compatible URL la plus courte ; choisissez l'UUIDv7 quand vous devez rester dans le format UUID standard avec ses bits de version et de variante. Standardisez sur l'un par système, et utilisez l'onglet Convertir quand vous devez franchir la frontière.

ULID — questions fréquentes

Qu'est-ce qu'un ULID ?
Un ULID (Universally Unique Lexicographically Sortable Identifier) est un identifiant de 128 bits conçu comme une alternative plus triable et plus compacte à l'UUID. Il s'écrit sous forme de 26 caractères en Base32 de Crockford : les 10 premiers caractères contiennent un horodatage de 48 bits en millisecondes depuis l'époque Unix, et les 16 caractères restants contiennent 80 bits d'aléa. Comme l'horodatage est la partie la plus significative et que le Base32 préserve l'ordre, les ULID créés plus tard se trient toujours après les précédents lorsqu'on les compare comme de simples chaînes — une colonne de ULID est donc naturellement ordonnée dans le temps. L'alphabet de Crockford exclut délibérément les lettres I, L, O et U pour éviter la confusion avec les chiffres et garder la chaîne insensible à la casse et compatible URL. Les ULID ont été introduits pour résoudre un problème pratique des UUIDv4 aléatoires : les identifiants aléatoires se dispersent dans un index de base de données, ce qui nuit aux performances d'insertion, alors qu'un ULID préfixé par le temps atterrit à chaque fois près de la fin de l'index.
ULID ou UUID — lequel utiliser ?
Utilisez un ULID lorsque vous voulez des identifiants à la fois uniques et naturellement triables par date de création ; utilisez un UUIDv4 classique lorsque vous avez spécifiquement besoin d'un identifiant opaque, entièrement aléatoire et sans horodatage intégré. Les différences clés : un ULID compte 26 caractères en Base32 contre 36 caractères avec tirets pour un UUID, donc les ULID sont plus courts et compatibles URL sans échappement. Un ULID encode son heure de création, ce que ne fait pas un UUIDv4 — utile pour l'ordonnancement et le débogage, mais à noter si vous préférez ne pas exposer le moment où un enregistrement a été créé. Les deux font 128 bits et tous deux évitent toute coordination, donc le risque de collision est négligeable dans les deux cas. Si votre pile standardise sur les UUID mais que vous voulez tout de même un ordonnancement temporel, l'UUIDv7 (du générateur UUID) offre une conception préfixée par le temps similaire au format UUID — ou vous pouvez générer des ULID ici et les convertir en UUID avec l'onglet Convertir.
Les ULID sont-ils triables ?
Oui — c'est leur caractéristique déterminante. Comme l'horodatage de 48 bits en millisecondes occupe les 10 premiers caractères et que le Base32 de Crockford préserve l'ordre lexicographique, trier des ULID comme des chaînes ordinaires les trie par date de création. Cela vaut dans tout système qui compare les chaînes octet par octet : un ORDER BY de base de données, un ensemble trié, un listing de fichiers ou un simple tri de tableau. Le bénéfice concret, c'est la performance en base de données : les clés ordonnées dans le temps s'ajoutent à la fin d'un index B-tree au lieu de se disperser aléatoirement comme les UUIDv4, ce qui garde les insertions rapides et l'index compact. Au sein d'une même milliseconde, l'ordre des ULID ordinaires est aléatoire ; donc si vous avez besoin d'un ordre strict même pour des identifiants créés dans la même milliseconde, utilisez le mode monotone, qui incrémente l'aléa pour que chaque valeur soit garantie supérieure à la précédente.
Comment décoder l'horodatage d'un ULID ?
Collez le ULID dans l'onglet Décoder et l'outil extrait instantanément l'heure de création intégrée, entièrement dans votre navigateur. Il lit les 10 premiers caractères, les reconvertit du Base32 de Crockford vers un entier de 48 bits en millisecondes depuis l'époque Unix, et affiche cet instant en UTC et en heure locale ainsi que la valeur Unix-milliseconde brute. Par exemple, le ULID canonique 01ARYZ6S41TSV4RRFFQ69G5FAV se décode en 1469918176385 ms, soit 2016-07-30T22:36:16.385Z. Les 16 caractères restants sont l'aléa de 80 bits et n'ont aucun sens à décoder. Lire l'horodatage de cette manière est pratique pour déboguer, vérifier quand un enregistrement a été créé, ou confirmer qu'un identifiant est bien un ULID — sans aucune requête en base de données.
Qu'est-ce qu'un ULID monotone ?
Un ULID monotone garantit un ordre strict même pour des identifiants générés dans la même milliseconde. Les ULID ordinaires créés dans une même milliseconde partagent le même préfixe temporel de 10 caractères, mais leurs suffixes aléatoires de 80 bits sont indépendants, donc leur ordre relatif n'est pas défini. La génération monotone résout cela : le premier ULID d'une milliseconde donnée reçoit un aléa neuf, et chaque ULID suivant dans cette même milliseconde est produit en incrémentant l'aléa précédent de un. Le résultat est une séquence où chaque valeur est strictement supérieure à la précédente, donc un lot inséré dans une boucle serrée reste parfaitement trié. Cela compte pour les systèmes à haut débit — journaux d'événements, files de messages, imports en masse — où de nombreuses lignes peuvent être créées plus vite que l'horloge en millisecondes ne s'incrémente et où vous avez tout de même besoin d'une clé stable et croissante.
Ce générateur ULID est-il sûr et confidentiel ?
Oui sur les deux points. L'aléa de chaque ULID provient de crypto.getRandomValues, le générateur de nombres aléatoires cryptographiquement sûr du navigateur — jamais Math.random — donc les 80 bits aléatoires sont imprévisibles et le risque que deux ULID entrent en collision dans la même milliseconde est infime. Tout aussi important, tout s'exécute localement : les ULID sont générés, décodés et convertis entièrement sur votre appareil. Rien n'est téléversé, journalisé ni stocké, et vous pouvez le confirmer en ouvrant les outils de développement et en observant l'onglet Réseau rester silencieux pendant que vous cliquez sur Générer. Cette propriété de confidentialité est toute la raison de créer des identifiants dans le navigateur plutôt que sur un serveur qui pourrait, en principe, conserver une copie de chaque valeur qu'il distribue.
Quelle est la différence entre ULID et UUIDv7 ?
ULID et UUIDv7 sont tous deux des identifiants de 128 bits ordonnés dans le temps qui placent un horodatage en millisecondes en premier, donc tous deux se trient par date de création et tous deux s'indexent efficacement — l'idée centrale est la même. La différence tient au format et à l'encodage. Un ULID est présenté comme 26 caractères en Base32 de Crockford sans tirets, ce qui est plus court et compatible URL ; l'UUIDv7 est présenté dans la disposition UUID standard de 36 caractères en hexadécimal avec tirets et porte des bits de version et de variante à des positions fixes, c'est donc un UUID RFC 9562 pleinement valide qu'accepte n'importe quelle bibliothèque UUID. Choisissez l'UUIDv7 quand vous devez rester dans l'écosystème UUID (une colonne de base de données UUID, une API typée UUID) ; choisissez le ULID quand vous voulez la chaîne triable la plus courte. Comme les deux font 128 bits, vous pouvez générer un ULID ici et le convertir en forme UUID avec l'onglet Convertir, ou générer un UUIDv7 avec le générateur UUID.