Generador ULID: identificadors curts, ordenables i URL‑segurs
La pàgina ulid‑generator forma part d’un conjunt d’eines en línia que creen identificadors únics. Quan seleccioneu el format ULID, trieu entre 1 i 100 i cliqueu a generar, obteniu una llista de cadenes de 26 caràcters preparades per copiar individualment o totes alhora. Tot el procés passa localment al vostre navegador, sense enviar res a cap servidor.
Què fa diferent aquesta pàgina
A diferència dels formats UUID o NanoID que ofereix la mateixa eina, ULID produeix identificadors més curts (26 caràcters en lloc de 36) i fa servir exclusivament l’alfabet base32 de Crockford. Això els fa insensibles a les majúscules/minúscules i sense guions. A més, ULID és lexicogràficament ordenable per temps de creació perquè els primers 10 caràcters codifiquen una marca de temps amb precisió de mil·lisegon. Com que l’alfabet base32 només conté caràcters segurs per a URL (0‑9, A‑Z excepte I, L, O, U), no cal escapar‑los. La pàgina no inclou commutadors per a majúscules ni guions perquè ULID és inherentment insensible a les majúscules i no porta guions. La component aleatòria ocupa els 16 caràcters restants (80 bits), i el valor total subjacent és de 128 bits.
Estructura interna d’un ULID
Un ULID de 26 caràcters es descompon en dues parts:
- Timestamp (10 caràcters, 48 bits): codifica el nombre de mil·lisegons des de l’època Unix (1 de gener de 1970) en base32 de Crockford. Per exemple,
01ARZ3NDEKcorrespon a una data concreta. - Component aleatori (16 caràcters, 80 bits): generat amb
crypto.getRandomValues(), que proporciona una font d’aleatorietat criptogràfica forta en el navegador.
La representació total de 128 bits ocupa exactament el mateix espai que un UUID, però en menys caràcters gràcies a l’eficiència de la base32. Per a un mateix nivell de col·lisió, ULID és més compacte.
Exemple d’ULID complet: 01ARZ3NDEKTSV4RRFFQ69G5FAV.
Els deu primers caràcters (01ARZ3NDEK) són el timestamp; els 16 restants (TSV4RRFFQ69G5FAV) són aleatoris.
Alfabet base32 de Crockford: per què no hi ha confusió visual
Crockford va dissenyar aquest alfabet per eliminar caràcters ambigus. Exclou la lletra I, la L, la O i la U per evitar confusions amb l’1, el 0 i la V, respectivament. L’alfabet complet és:
0 1 2 3 4 5 6 7 8 9 A B C D E F G H J K M N P Q R S T V W X Y Z
Observeu que falten I, L, O, U. Això fa que ULID sigui insensible a les majúscules: tant 01ARZ3NDEKTSV4RRFFQ69G5FAV com 01arz3ndektsv4rrffq69g5fav són vàlids i es consideren equivalents. En la pràctica, els ULID solen mostrar‑se en majúscules perquè el timestamp sigui fàcilment llegible, però el programari hauria de tractar‑los sense distinció de caixa.
Comparació amb UUID v4 i UUID v7
| Propietat | UUID v4 (canònic) | UUID v7 (proposta) | ULID |
|---|---|---|---|
| Longitud | 36 caràcters | 36 caràcters | 26 caràcters |
| Guions | 4 | 4 | 0 |
| Sensibilitat maj./min. | Insensible (en hex, però habitualment en min.) | Insensible | Insensible per disseny |
| Ordenable per temps | No (aleatori) | Sí (timestamp ms) | Sí (timestamp ms) |
| Bits de timestamp | 0 | 48 | 48 |
| Bits aleatoris | 122 | 74 | 80 |
| Alfabet | hexadecimal (0‑9, a‑f) | hexadecimal (0‑9, a‑f) | base32 Crockford (0‑9, A‑Z sense I,L,O,U) |
Els ULID són més curts que qualsevol UUID amb guions, i la seva ordenació lexicogràfica els fa atractius com a claus primàries en bases de dades perquè milloren el rendiment dels arbres B. En canvi, els UUID v4 aleatoris provoquen fragmentació de les pàgines d’índex.
Comportament d’ordenació i limitacions en el mateix mil·lisegon
Els ULID s’ordenen lexicogràficament per temps de creació: si genereu una llista de 10 ULIDs, els primers 10 caràcters reflectiran l’ordre cronològic. No obstant això, dins d’un mateix mil·lisegon no hi ha cap garantia d’ordre estricte. La component aleatòria de 80 bits no incorpora cap seqüència monòtona, de manera que dos ULID generats en el mateix tic de rellotge poden sortir en qualsevol ordre aleatori. Si necessiteu ordre estricte dins del mateix mil·lisegon, cal afegir un comptador extern o utilitzar un altre esquema (per exemple, el camp monotònic opcional de la proposta ULID).
La probabilitat de col·lisió en el component aleatori és extremadament baixa: amb 80 bits aleatoris, generar un milió d’ULID per segon durant un any sencer dona una probabilitat de duplicat molt per sota del 10⁻¹². En la pràctica, la generació en el navegador amb crypto.getRandomValues() és suficient per a qualsevol aplicació raonable.
Ús en bases de dades i rendiment dels índexs
Les claus primàries que són monòtonament creixents (com un enter autonumèric o un ULID) insereixen noves files al final de l’índex B‑tree, evitant divisions de pàgina freqüents. En canvi, les claus aleatòries (com UUID v4) provoquen insercions disperses que fragmenten l’índex i alenteixen les escriptures. Per això molts arquitectes de bases de dades prefereixen ULID per a sistemes distribuits on no es pot confiar en un comptador centralitzat, però es vol evitar el cost d’un UUID completament aleatori.
Un desavantatge menor: els ULID contenen lletres, de manera que emmagatzemar‑los com a cadenes ocupa 26 bytes (o 26 caràcters en codificació UTF‑8), mentre que un UUID binari ocupa 16 bytes. Si la base de dades admet un tipus BINARY(16), es pot emmagatzemar l’ULID en 16 bytes després de desxifrar la base32. Però la majoria d’aplicacions tracten els ULID com a text i accepten l’espai extra.
Generació local i privadesa
Tot el procés de generació es fa al navegador de l’usuari. La pàgina no envia cap dada a servidors externs. Quan carregueu el conjunt d’eines, el codi JavaScript utilitza crypto.getRandomValues() per crear els bytes aleatoris. Això contrasta amb serveis basats en API remotes, que requereixen connexió i poden generar preocupacions de privadesa. Com no hi ha cap sol·licitud de xarxa, la generació és instantània i funciona totalment desconnectada un cop carregada la pàgina.
Errors comuns i com evitar‑los
- Confondre ULID amb UUID: per l’aparença, un ULID pot semblar un UUID sense guions, però la codificació és diferent (base32 vs hexadecimal). No intenteu decodificar un ULID com a hexadecimal.
- Tractar‑lo com a sensible a majúscules: tot i que visualment es mostrin en majúscules, el software ha d’acceptar tant majúscules com minúscules. Si emmagatzemeu un ULID en base de dades amb col·lació sensible a majúscules, podríeu tenir duplicats aparents.
- Esperar ordenació dins del mateix mil·lisegon: com s’ha dit, l’ordre només és garantit entre mil·lisegons diferents. Per aplicar un ordre estricte, combineu ULID amb un comptador local.
- Usar un nombre de IDs fora del rang permès: la pàgina només genera entre 1 i 100 IDs. Si intenteu 0 o 101, el formulari hauria de rebutjar l’entrada (o donar un missatge d’error). Comproveu sempre el valor del camp “Count”.
- Copiar tot amb un sol clic: el botó “Copied all!” copia tota la llista al porta‑retalls. Si necessiteu només un ID, feu clic a la cadena individual.
Preguntes freqüents (FAQ)
P: Quants bits té un ULID?
R: 128 bits, dividits en 48 de timestamp i 80 d’aleatoris.
P: Puc canviar el nombre d’IDs després de generar-los?
R: Sí. Si modifiqueu el valor de “Count” o qualsevol altra opció, la llista es regenera automàticament.
P: Per què no veig commutadors de majúscules o guions?
R: Perquè ULID és insensible a les majúscules (l’alfabet base32 de Crockford no distingeix majúscules de minúscules) i no conté guions. Aquestes opcions no tenen sentit per a aquest format.
P: Els ULID generats són únics a tot el món?
R: L’aleatorietat de 80 bits fa que la probabilitat de col·lisió sigui negligible per a aplicacions pràctiques. No obstant, la pàgina no manté cap registre d’estat entre sessions; si dos usuaris generen simultàniament ULID amb el mateix timestamp, podria (remotament) produir‑se un duplicat, però les probabilitats són inferiors a 1 entre 10²⁴.
P: Com puc saber si un ULID és correcte?
R: Ha de tenir exactament 26 caràcters, contenir només els caràcters de l’alfabet base32 de Crockford (0‑9, A‑H, J‑K, M‑N, P‑T, V‑Z, sense I, L, O, U) i ser vàlid amb qualsevol combinació de majúscules/minúscules. Podeu validar‑lo amb una expressió regular: ^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]‹26›$ (en mode insensible a majúscules).
P: Puc generar ULID per a usos comercials?
R: Sí. No hi ha restriccions llicència en els valors generats per l’eina; el format ULID és obert i no té patents conegudes.