Genera ULIDs ordenables de 26 caracteres (Crockford base32) y decodifica la marca de tiempo embebida a una fecha. Ideal como clave primaria.
Identificadores unicos ordenables. Un ULID tiene 26 caracteres: los primeros 10 codifican el tiempo de creacion en milisegundos y los ultimos 16 son aleatorios. Eso los hace ordenables y seguros como claves. Generado en tu navegador.
Marca de tiempo:
ULID invalido
ULID frente a UUID
Que es un ULID
Un ULID es un identificador de 128 bits, del mismo ancho que un UUID, dividido en dos partes: una marca de tiempo de 48 bits en milisegundos seguida de 80 bits aleatorios. Se representa con 26 caracteres en base32 de Crockford en lugar de los 36 caracteres hexadecimales con guiones de un UUID, asi que es mas corto, insensible a mayusculas y libre de los caracteres mas faciles de confundir: I, L, O y U quedan fuera del alfabeto.
La diferencia importante no es la codificacion sino el orden. Como la marca de tiempo ocupa los bits altos y base32 preserva el orden de bytes, ordenar ULIDs como cadenas normales los ordena por momento de creacion. Dos IDs generados en el mismo milisegundo se desempatan por su componente aleatorio, pero entre milisegundos el orden es exacto.
Por que la ordenabilidad importa en bases de datos
UUIDv4 es uniformemente aleatorio, justo lo que no quieres en un indice agrupado. Cada insercion cae en un punto aleatorio del arbol B, de modo que la base de datos divide paginas constantemente y toca paginas frias. El indice crece mas de lo necesario y el rendimiento de escritura se degrada segun crece la tabla. Es un problema bien documentado con claves primarias UUID en InnoDB de MySQL y en SQL Server.
Un identificador ordenado por tiempo se anade cerca del extremo derecho del indice, el mismo patron de acceso que un entero autoincremental. Conservas las ventajas de una clave unica global generada en cliente (sin viaje de ida y vuelta para obtener un ID, sin coordinacion entre servicios, fusiones seguras entre shards) sin la fragmentacion del indice.
Cuando usar otra cosa
UUIDv7, estandarizado en el RFC 9562, hace lo mismo que ULID pero con el formato y la disposicion estandar de UUID. Si tu stack ya tiene tipos de columna UUID nativos y herramientas alrededor, UUIDv7 suele ser hoy la mejor eleccion simplemente porque encaja en el ecosistema existente. ULID sigue siendo atractivo cuando quieres la forma textual mas corta y amable en URLs o logs.
En cualquier caso, ten claro que la marca de tiempo es visible para quien tenga el ID. Los momentos de creacion se filtran y los IDs adyacentes revelan el orden: no los uses donde la enumeracion o el momento sean sensibles. Y aunque con 80 bits aleatorios por milisegundo las colisiones no son una preocupacion practica, los ULID no son secretos y nunca deben usarse como tokens de acceso.
Preguntas frecuentes
¿En qué se diferencia un ULID de un UUID?
Ambos ocupan 128 bits, pero el ULID coloca primero una marca de tiempo de 48 bits en milisegundos, así que ordenar las cadenas equivale a ordenar por fecha de creación. UUIDv4 es puramente aleatorio y su orden es arbitrario.
¿Por qué importa la ordenabilidad en una base de datos?
Las claves primarias aleatorias dispersan las inserciones por el árbol B y fragmentan el índice. Las claves ordenadas por tiempo se añaden cerca del final, lo que mantiene las escrituras secuenciales y el conjunto de páginas activas pequeño.
¿Los ID creados en el mismo milisegundo mantienen el orden?
En modo monótono, sí. En lugar de volver a sortear la parte aleatoria, la herramienta la incrementa, de modo que varios ID generados en un mismo milisegundo siguen saliendo en orden.
¿Es seguro exponer un ULID públicamente?
La mitad aleatoria es imposible de adivinar, pero cualquiera puede leer la marca de tiempo. Si la fecha de creación de un registro es sensible, no uses un ULID como identificador público.
¿Elijo ULID o UUIDv7?
Resuelven el mismo problema. UUIDv7 está estandarizado en el RFC 9562 y encaja en las columnas y bibliotecas UUID existentes, así que prefiérelo salvo que quieras específicamente la forma Crockford de 26 caracteres.
¿Por qué 26 caracteres?
Codificar 128 bits en Base32 de Crockford requiere 26 símbolos. El alfabeto excluye I, L, O y U para evitar tanto errores de transcripción como palabras accidentales.