Saltar al contenido
nearnull

Generador de ULID

Generá identificadores ULID ordenables por tiempo, con modo monotónico opcional. Funciona enteramente en tu navegador: no se envía nada a ningún servidor.

Opciones

Los identificadores creados en el mismo milisegundo siguen creciendo, así que un lote queda en orden de generación.

ULIDs

Acá aparecen los ULIDs generados

¿Qué es un ULID?

Un ULID es un identificador de 128 bits, del mismo tamaño que un UUID, escrito en 26 caracteres en vez de 36. Sus primeros 48 bits son el momento de creación en milisegundos y los 80 restantes son aleatorios, así que ordenar ULIDs como strings comunes los ordena por momento de creación. La codificación es Crockford Base32, que deja afuera la I, la L, la O y la U: eso evita tanto las confusiones entre dígitos y letras cuando alguien lee uno en voz alta, como la posibilidad de que un identificador termine deletreando algo desafortunado. Todo se genera en tu navegador con su fuente aleatoria criptográfica.

Cómo se reparten los 26 caracteres

1 - 1048 bits

Milisegundos desde la época Unix, big-endian. Esto es lo que hace que los ULIDs se ordenen cronológicamente, y es legible: la herramienta lo decodifica para cada valor que genera.

11 - 2680 bits

Bits aleatorios del generador criptográfico del navegador. Con el modo monotónico activado, dentro de un mismo milisegundo se incrementan en vez de volver a sortearse, lo que mantiene el lote en orden.

Ejemplos

Cómo generar ULIDs en los lenguajes que probablemente uses:

JavaScript
import { ulid } from "ulid";

ulid(); // 01ARZ3NDEKTSV4RRFFQ69G5FAV
Python
import ulid

ulid.new().str
Java
import com.github.f4b6a3.ulid.UlidCreator;

UlidCreator.getMonotonicUlid().toString();
Go
import "github.com/oklog/ulid/v2"

ulid.Make().String()
PHP
use Ulid\Ulid;

Ulid::generate();
PostgreSQL
-- store as a 16-byte value, not text
CREATE TABLE orders (id bytea PRIMARY KEY);

Casos de uso

Claves primarias que no fragmentan el índice

Los UUID aleatorios caen por todos lados en un índice B-tree, así que cada inserción ensucia una página distinta. Los ULIDs están ordenados por tiempo, así que las inserciones se agregan cerca del final del índice: por eso se comportan mucho mejor como claves primarias con volumen.

Ordenar eventos sin una columna de timestamp aparte

Como el tiempo está embebido en el valor, las líneas de log, los eventos y los mensajes se ordenan bien solo por id, incluso cuando llegan desordenados o desde máquinas distintas.

Identificadores que aparecen en URLs o se dictan

26 caracteres en vez de 36, sin guiones, y sin I/L/O/U que se confundan con 1/0. Eso hace que los ULIDs sean bastante más fáciles de pegar en una URL, imprimir en una etiqueta o dictar por teléfono.

Ids generados en el cliente

Igual que los UUID, los ULIDs no necesitan coordinación: un navegador, una app móvil o un worker offline puede crear uno sin preguntarle a un servidor, y sigue siendo único cuando los datos se sincronizan.

Preguntas frecuentes

¿ULID o UUID?
Usá ULID cuando los identificadores se inserten en un índice ordenado o necesiten ordenarse por momento de creación, y cuando los vayan a ver personas. Usá UUID cuando una especificación, un tipo de columna de la base de datos o un sistema existente esperen ese formato exacto. También conviene conocer UUIDv7: lleva el mismo orden temporal al formato UUID estándar.
¿Qué cambia realmente el modo monotónico?
Dentro de un mismo milisegundo, los ULIDs comparten el mismo prefijo de timestamp, así que su orden depende de la cola aleatoria, que es efectivamente arbitraria. El modo monotónico, en cambio, incrementa el valor aleatorio anterior, garantizando que cada identificador nuevo se ordene después del último. Generar un lote acá es exactamente ese caso: todos comparten un milisegundo.
¿Los ULIDs filtran cuándo se creó un registro?
Sí, ese es el intercambio. El timestamp está ahí en los primeros diez caracteres y cualquiera lo puede decodificar, como hace esta herramienta. Si el momento de creación de un registro es sensible, o si es un problema que los identificadores sean adivinables en secuencia, usá un identificador completamente aleatorio como UUIDv4.
¿Dos ULIDs pueden colisionar?
Con 80 bits aleatorios por milisegundo, generar incluso miles de identificadores en el mismo milisegundo deja la probabilidad de colisión en algo despreciable. En modo monotónico las colisiones dentro de una misma corrida son imposibles por construcción, porque cada valor es el anterior incrementado.
¿Los ULIDs en minúscula son válidos?
La forma canónica es en mayúsculas, y es la que deberías guardar y comparar. La decodificación Crockford Base32 no distingue mayúsculas de minúsculas, así que en minúscula parsea bien, pero mezclar cajas en una columna de base de datos es una forma fácil de terminar con dos filas que son el mismo identificador para una persona y distintas para el índice.
¿Cómo conviene guardarlos en una base de datos?
Como 16 bytes crudos cuando tu base tenga un tipo binario de tamaño fijo o un tipo UUID: es la mitad del espacio que la forma de texto de 26 caracteres y mantiene baratas las comparaciones. Guardalos como texto solo si necesitás que el id se lea directamente en los resultados de las consultas.
¿Estos se generan en un servidor?
No. Se generan en tu navegador con el JavaScript de esta página, usando el generador de números aleatorios criptográfico integrado. No se transmite ni se guarda nada en ningún lado.