Générez des ULID triables de 26 caractères (Crockford base32) et décodez le timestamp intégré en une date. Idéal pour les clés primaires de base de données.
Des identifiants uniques triables. Un ULID compte 26 caractères : les 10 premiers encodent l'heure de création en millisecondes, les 16 derniers sont aléatoires. Cela les rend triables lexicographiquement et sûrs à utiliser comme clés. Généré dans votre navigateur.
Timestamp :
ULID invalide
ULID face à UUID
Ce qu'est un ULID
Un ULID est un identifiant de 128 bits, soit la même largeur qu'un UUID, divisé en deux parties : un timestamp de 48 bits en millisecondes suivi de 80 bits aléatoires. Il est rendu sous la forme de 26 caractères en Crockford base32 plutôt que les 36 caractères hexadécimaux séparés par des tirets d'un UUID, si bien qu'il est plus court, insensible à la casse et exempt des caractères les plus facilement confondus — I, L, O et U sont tous exclus de l'alphabet.
La différence qui compte n'est pas l'encodage, c'est l'ordre. Comme le timestamp occupe les bits de poids fort et que la base32 préserve l'ordre des octets, trier les ULID comme de simples chaînes les trie par heure de création. Deux identifiants générés dans la même milliseconde retombent sur leur composante aléatoire, mais d'une milliseconde à l'autre l'ordre est exact.
Pourquoi le tri compte pour les bases de données
L'UUIDv4 est uniformément aléatoire, ce qui est exactement ce que vous ne voulez pas dans un index en cluster. Chaque insertion atterrit à un point aléatoire dans le B-tree, si bien que la base de données ne cesse de scinder des pages et de toucher à des pages froides. L'index grossit plus que nécessaire et le débit en écriture se dégrade à mesure que la table grandit. C'est un problème bien documenté avec les clés primaires UUID dans l'InnoDB de MySQL et dans SQL Server.
Un identifiant ordonné dans le temps est ajouté près du bord droit de l'index, ce qui correspond au même modèle d'accès qu'un entier à auto-incrément. Vous conservez les avantages d'une clé globalement unique générée côté client — aucun aller-retour pour obtenir un identifiant, aucune coordination entre les services, fusions sûres entre les partitions — sans la fragmentation de l'index.
Quand utiliser autre chose
L'UUIDv7, normalisé dans la RFC 9562, fait la même chose qu'un ULID dans le format et la disposition standard d'un UUID. Si votre pile dispose déjà de types de colonnes et d'outils UUID natifs, l'UUIDv7 est généralement le meilleur choix aujourd'hui simplement parce qu'il s'intègre à l'écosystème existant. L'ULID reste attractif lorsque vous voulez la forme texte plus courte et plus conviviale dans les URL ou les journaux.
Dans tous les cas, sachez que le timestamp est visible par quiconque détient l'identifiant. Les heures de création fuient, et les identifiants adjacents révèlent l'ordre — n'utilisez pas ces identifiants pour ce qui est sensible à l'énumération ou au timing. Et avec 80 bits aléatoires par milliseconde, les collisions ne sont pas un problème pratique, mais les ULID ne sont pas des secrets et ne doivent jamais servir de jetons de capacité.
FAQ
En quoi un ULID diffère-t-il d'un UUID ?
Tous deux font 128 bits, mais un ULID place d''abord un timestamp de 48 bits en millisecondes, si bien que trier les chaînes trie par heure de création. L''UUIDv4 est entièrement aléatoire et se trie arbitrairement.
Pourquoi le tri compte-t-il pour une base de données ?
Les clés primaires aléatoires dispersent les insertions dans un B-tree et fragmentent l''index. Les clés ordonnées dans le temps sont ajoutées près de la fin, ce qui garde les écritures séquentielles et les pages actives réduites.
Les identifiants créés dans la même milliseconde restent-ils ordonnés ?
En mode monotonique, oui. Au lieu de redessiner la partie aléatoire, l''outil l''incrémente, si bien que plusieurs identifiants générés dans une même milliseconde restent ordonnés en sortie.
Un ULID est-il sûr à exposer publiquement ?
La moitié aléatoire est invérifiable, mais le timestamp est lisible par tous. Si l''heure de création d''un enregistrement est sensible, n''utilisez pas un ULID comme son identifiant public.
Dois-je choisir ULID ou UUIDv7 ?
Ils résolvent le même problème. L''UUIDv7 est normalisé dans la RFC 9562 et s''intègre aux colonnes et bibliothèques UUID existantes, aussi préférez-le pour du nouveau travail sauf si vous voulez spécifiquement la forme Crockford de 26 caractères.
Pourquoi 26 caractères ?
128 bits encodés en Crockford Base32 nécessitent 26 symboles. L''alphabet exclut I, L, O et U pour éviter à la fois les erreurs de transcription et les mots accidentels.