Generador y decodificador de ULID | Identificadores ordenables por tiempo
Genera un ULID de 26 caracteres en Crockford Base32 con un clic, o pega uno para extraer su hora de creación. Los primeros 10 caracteres guardan un timestamp de 48 bits en milisegundos y los últimos 16 guardan 80 bits de aleatoriedad, así que el panel decodificado muestra el valor en milisegundos, la fecha ISO 8601 UTC, la cola aleatoria en hexadecimal y si la cadena está bien formada.
💡 Sobre esta herramienta
Un ULID parece un bloque opaco de 26 caracteres, pero la mitad de esa cadena es un timestamp legible escondido a plena vista. El detalle es que ese timestamp está en Crockford Base32, no en hexadecimal ni en decimal, de modo que mirar 01ARZ3NDEKTSV4RRFFQ69G5FAV no te dice cuándo se creó. Decodificarlo a mano significa mapear cada uno de los primeros diez caracteres a un valor de 5 bits, acumularlos en base 32 y convertir el resultado en una fecha.
Esta herramienta hace ese viaje de ida y vuelta en ambos sentidos. Al pegar un ULID valida la longitud, rechaza cualquier carácter fuera del alfabeto Crockford (que omite a propósito I, L, O y U para evitar confusiones visuales), separa el timestamp de la cola aleatoria y representa la hora de creación como una cadena ISO 8601. La vista por segmentos pinta la mitad temporal y la aleatoria en colores distintos, de forma que la estructura se entiende de un vistazo, algo que una simple llamada de librería no te ofrece.
🧐 Preguntas frecuentes
¿En qué se diferencia de un UUID v4? Un UUID v4 son 122 bits de aleatoriedad pura, sin orden inherente. Un ULID coloca al frente un timestamp de 48 bits en milisegundos, así que dos ULID creados en momentos distintos se ordenan cronológicamente por simple comparación de cadenas. UUID v7 añadió después un prefijo de tiempo similar; ULID lo lleva desde su especificación de 2016.
¿Por qué el orden alfabético coincide con el orden temporal? Porque los bits más significativos van primero. El timestamp ocupa los 10 caracteres iniciales, así que al ordenar las cadenas ULID alfabéticamente los más antiguos quedan delante. Eso los hace cómodos como claves primarias de base de datos, donde las inserciones ordenadas mantienen compactos los índices B-tree.
¿Qué es Crockford Base32? Es un alfabeto de base 32 que descarta las letras I, L, O y U. I y L se excluyen para no confundirse con 1, O con 0, y U para evitar formar palabras inapropiadas. Quedan los dígitos 0-9 y 22 letras mayúsculas, 32 símbolos en total, cada uno codificando 5 bits.
¿Pueden colisionar dos ULID?
Dentro del mismo milisegundo la colisión depende de los 80 bits aleatorios, que dan unas 1,2 × 10^24 combinaciones. Un choque práctico es astronómicamente improbable. La aleatoriedad aquí proviene de crypto.getRandomValues del navegador, no de un generador pseudoaleatorio débil.
¿Distingue mayúsculas de minúsculas? No. La decodificación Crockford es insensible a mayúsculas, por lo que la entrada se normaliza a mayúsculas antes de validar. Puedes pegar un ULID en minúsculas y obtener igualmente una decodificación limpia.
📚 Datos curiosos: por qué 26 caracteres
ULID fue publicado por Alizain Feerasta en 2016 como respuesta a que UUID v4 encajaba mal en bases de datos ordenadas, y el formato tiene un par de rarezas deliberadas que conviene conocer. El campo de timestamp es de 48 bits, lo que cubre fechas hasta el año 10889 antes de desbordar, así que no es un problema que vayas a encontrar. La codificación ajusta el valor a exactamente 26 caracteres Crockford: 48 bits de timestamp y 80 de aleatoriedad suman 128, el mismo ancho que un UUID, algo nada casual, ya que se diseñó para caber en la misma columna de 128 bits. Que aterrice en 26 caracteres y no en los 25 que esperarías de 128 bits divididos entre 5 se debe a que el primer carácter solo usa 3 de sus 5 bits, razón por la que un ULID válido nunca empieza por un carácter superior a 7.