Generador de ULID

Genera de forma masiva ULID, identificadores ordenables cronológicamente que funcionan como alternativa a los UUID.

Consejos de uso

  • Los primeros 10 caracteres de un ULID codifican una marca de tiempo (el momento de creación), mientras que los 16 restantes son aleatorios. Salvo que dos ULID se generen en el mismo milisegundo, basta con ordenarlos como cadenas de texto para obtener el orden cronológico de creación.
  • Usar un UUID v4 completamente aleatorio como clave primaria en una base de datos tiende a fragmentar los índices B-tree, ya que las nuevas filas se insertan en posiciones aleatorias. Como los ULID se ordenan aproximadamente por tiempo, las filas nuevas se añaden cerca del final del índice, lo que ayuda a mitigar este problema.
  • Un ULID se representa con 26 caracteres en Base32 de Crockford (el alfabeto de 32 caracteres `0`-`9` y `A`-`Z` sin las letras I, L, O y U, fáciles de confundir), lo que lo hace más corto que un UUID (36 caracteres incluyendo guiones) y seguro de usar en entornos que no distinguen mayúsculas de minúsculas.
  • Para comparar formatos con Nano ID y UUID v4, consulta la tabla comparativa disponible en nuestra herramienta hermana, el Generador de Nano ID.

Preguntas frecuentes

Un ULID (Universally Unique Lexicographically Sortable Identifier) es una especificación de identificadores que, al igual que un UUID, son globalmente únicos, pero que además incorporan información sobre el momento de creación, de modo que un simple ordenamiento de cadenas de texto los deja en orden cronológico.

La diferencia principal es si el identificador puede ordenarse por momento de creación. Un UUID v4 es un valor de 128 bits completamente aleatorio, por lo que no se puede ordenar por orden de creación, mientras que los primeros 48 bits de un ULID son una marca de tiempo en milisegundos, así que una simple comparación de cadenas revela el orden de creación. También hay una diferencia de formato: un ULID tiene 26 caracteres en Base32, mientras que un UUID tiene 36 caracteres hexadecimales incluyendo guiones.

Usar un valor completamente aleatorio como UUID v4 como clave primaria hace que las filas nuevas se inserten en posiciones aleatorias dentro del índice, lo que puede provocar fragmentación del índice B-tree y reducir la eficiencia de la caché. Como los ULID se ordenan aproximadamente por tiempo, las filas nuevas tienden a añadirse cerca del final del índice, lo que se dice que ayuda a mitigar este problema.

Los primeros 10 caracteres son una marca de tiempo de 48 bits en milisegundos (capaz de representar fechas hasta aproximadamente el año 10889), y los 16 caracteres restantes son 80 bits de aleatoriedad. En total son 128 bits, los mismos que un UUID, pero con información del momento de creación incorporada, lo cual es la característica distintiva del ULID.
ツールくん

A propósito — cómo ULID introdujo el orden cronológico en el mundo de los identificadores

La especificación ULID fue publicada en 2016 por Alizain Feerasta. En aquel momento, UUID ya era el método estándar para generar identificadores únicos en sistemas distribuidos, pero su naturaleza completamente aleatoria (que impedía ordenarlos) resultaba poco práctica para la eficiencia de los índices de bases de datos y para el análisis temporal de registros (logs). ULID nació precisamente para resolver ese problema.

En realidad, UUID también tiene variantes basadas en tiempo: la versión 1 (dirección MAC más marca de tiempo) y la versión 7 (estandarizada en 2024, que combina marca de tiempo y valores aleatorios). Sin embargo, ULID es una especificación independiente, distinta del estándar UUID (RFC 4122), y se distingue por perseguir un diseño más simple junto con una representación compacta en Base32.

Hoy en día existen bibliotecas de implementación de ULID en prácticamente todos los lenguajes de programación importantes, y se usa ampliamente en escenarios donde importa conservar el orden de creación: identificadores de eventos en sistemas distribuidos, identificadores de traza en registros y claves primarias de bases de datos, entre otros. Su filosofía de diseño coincide en gran medida con la de UUID v7, que surgió por la misma época, y ambos coexisten como enfoques distintos para el mismo objetivo: un identificador ordenable similar al UUID.