Usa el Generador de ULIDs gratuito abajo: tus datos nunca salen de tu navegador, todo el trabajo ocurre en tu dispositivo y no se sube a ningún servidor.
ULID: el identificador que se ordena solo
Los ULID se crearon para corregir una molestia de los UUID: los UUID no se ordenan por fecha de creación. Si usas UUID aleatorios como claves de base de datos, las filas nuevas se dispersan al azar por el índice, lo que perjudica el rendimiento. Los ULID lo resuelven poniendo una marca de tiempo primero. Un ULID tiene 26 caracteres: los 10 primeros codifican la hora de creación en milisegundos, y los 16 restantes codifican aleatoriedad. Como la marca de tiempo va primero y la codificación conserva el orden numérico, los ULID se ordenan cronológicamente como simples cadenas. Los registros más nuevos quedan de forma natural después de los más viejos.
La codificación es base32 Crockford, un alfabeto de dígitos y letras elegido para ser legible y sin ambigüedades. Excluye la I, la L, la O y la U, porque la I parece un 1, la L parece un 1, la O parece un 0, y la U se quitó para evitar formar palabras malsonantes por accidente. También trata la entrada en minúsculas como mayúsculas, así que el uso de mayúsculas no importa. El resultado es un identificador más corto que un UUID, con 26 caracteres, seguro para URLs, y seguro para leer en voz alta por teléfono sin confusión.
Cómo se construye un ULID
Toma la hora actual en milisegundos desde el 1 de enero de 1970. Codifícala en base32 con el alfabeto Crockford, rellenada a 10 caracteres. Esa es la parte de tiempo, y cubre fechas hasta el año 10889, así que no se agotará. Luego genera 80 bits de aleatoriedad, de una fuente aleatoria criptográfica, y codifícalos como 16 caracteres base32. Une las dos partes y tienes un ULID. Dos ULID creados en el mismo milisegundo comparten la parte de tiempo y difieren en la parte aleatoria, así que siguen siendo únicos, aunque su orden dentro de ese milisegundo es aleatorio en lugar de secuencial.
Esta herramienta genera ULID con crypto.getRandomValues de tu navegador, que es una fuente aleatoria criptográfica adecuada, y puede decodificar cualquier ULID de vuelta a su hora de creación. Pega un ULID y obtendrás su marca de tiempo en milisegundos más la fecha en UTC. Eso sirve para depurar: un ULID encontrado en un registro te dice exactamente cuándo se creó el registro, al milisegundo, sin consultar ninguna base de datos.
ULID frente a UUID: cuál elegir
Elige ULID cuando el orden importe. Las claves primarias de bases de datos, las entradas de registro, los flujos de eventos y las colas de mensajes se benefician del orden cronológico, porque las consultas por rango y los listados de “más recientes primero” se vuelven baratos. Elige UUID, en concreto la versión 4, cuando necesites la máxima imprevisibilidad o cuando debas interoperar con sistemas que esperan el formato UUID. Los ULID son también algo más compactos y amables con las personas, mientras que los UUID tienen más herramientas y una trayectoria más larga.
Hay compensaciones que conocer. La marca de tiempo de un ULID es visible para cualquiera que lo lea, así que filtra la hora de creación, igual que los UUID de versión 1 y 7. Si eso importa, usa un UUID aleatorio. Los ULID también tienen 80 bits de aleatoriedad en lugar de 122, lo que sigue siendo mucho más que suficiente para cualquier sistema real, pero es un margen menor. Y los ULID no distinguen mayúsculas por diseño, así que un sistema que los trate como cadenas sensibles a mayúsculas podría ver dos escrituras del mismo identificador como valores distintos; normalizar a mayúsculas evita eso.
Monotonía, y la pregunta del mismo milisegundo
La especificación ULID describe un modo monótono: cuando se generan varios ULID en el mismo milisegundo, la parte aleatoria se incrementa en lugar de volver a aleatorizarse, así que el orden se mantiene estrictamente creciente. No todas las implementaciones hacen esto, y esta herramienta usa aleatoriedad nueva cada vez, lo que es más sencillo y sigue siendo único. Para la mayoría de los usos, la aleatoriedad nueva está bien. Si necesitas la garantía estricta de que cada identificador generado se ordene después del anterior, usa una librería que implemente la generación monótona, y genera los identificadores a través de una sola instancia en lugar de muchas máquinas.
Una nota práctica más: los ULID tienen 26 caracteres, pero codifican 128 bits, lo mismo que un UUID. Nada se pierde en la cadena más corta; base32 es simplemente más compacto que el hexadecimal. Por eso los ULID parecen modernos: la misma información, menos desorden, y ordenación gratis.
Preguntas frecuentes
¿Se puede usar un ULID como clave primaria de base de datos? Sí, y ese es uno de sus usos principales, sobre todo en bases de datos donde las claves de texto se ordenan bien. ¿Se puede adivinar un ULID? En parte: la marca de tiempo es predecible, pero los 80 bits aleatorios no, así que el identificador completo no se puede adivinar. ¿Por qué no hay I, L, O ni U? Para evitar caracteres que se parecen o que forman palabras accidentales. ¿La generación se hace en local? Sí. Todo se ejecuta en tu navegador, y nada se envía a ningún sitio.
