Un Identificador único universal (UUID) es una etiqueta de 128 bits utilizada en sistemas informáticos para identificar información de forma única. Los UUID están diseñados para ser únicos en el espacio y el tiempo, lo que permite generarlos de forma independiente sin una autoridad central, lo que minimiza el riesgo de duplicación.
Los UUID sirven para varios propósitos, entre los que se incluyen:
- Identificación de registros en bases de datos.
- Etiquetado de objetos en sistemas distribuidos.
- Funcionan como claves principales en aplicaciones donde la unicidad es crítica.
Casos de uso del mundo real
-
Bases de datos: UUID se utiliza como clave principal en bases de datos relacionales para garantizar la identificación única de los registros.
-
Microservicios: facilita la comunicación del servicio proporcionando identificadores únicos para solicitudes y recursos.
-
Dispositivos IoT: identifica dispositivos de forma única en una red, lo que garantiza que los datos de múltiples fuentes se puedan agregar sin conflictos.
Ventajas y desventajas del uso de UUID
Ventajas:
-
Singularidad global: Es extremadamente improbable que los UUID colisionen, lo que los hace adecuados para sistemas distribuidos donde varios nodos generan identificadores de forma independiente.
-
No se requiere autoridad central: Se pueden generar sin coordinación, lo que simplifica las operaciones en entornos distribuidos.
-
Escalabilidad: Funcionan bien en sistemas que requieren escalamiento en múltiples servidores o servicios.
Desventajas:
-
Tamaño de almacenamiento: Los UUID consumen más espacio (128 bits) en comparación con los ID enteros tradicionales (normalmente 32 bits), lo que puede generar mayores costos de almacenamiento.
-
Problemas de rendimiento: La indexación de UUID puede degradar el rendimiento de la base de datos debido a su aleatoriedad y tamaño, lo que genera tiempos de consulta más lentos en comparación con los ID secuenciales.
-
Amigable con el usuario: Los UUID no son fáciles de recordar ni fáciles de usar cuando se presentan en las interfaces de usuario.
El estándar
La representación estándar de un UUID consta de 32 caracteres hexadecimales divididos en cinco grupos, separados por guiones, siguiendo el formato 8-4-4-4-12, dando como resultado un total de 36 caracteres (32 alfanuméricos más 4 guiones) .
El formato UUID se puede visualizar de la siguiente manera:
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Dónde:
-
M indica la versión del UUID.
-
N indica la variante, lo que ayuda a interpretar el diseño del UUID.
Componentes de un UUID
-
TimeLow: 4 bytes (8 caracteres hexadecimales) que representan el campo bajo de la marca de tiempo.
-
TimeMid: 2 bytes (4 caracteres hexadecimales) que representan el campo medio de la marca de tiempo.
-
TimeHighAndVersion: 2 bytes (4 caracteres hexadecimales) que incluyen el número de versión y el campo alto de la marca de tiempo.
-
ClockSequence: 2 bytes (4 caracteres hexadecimales) que se utilizan para ayudar a evitar colisiones, especialmente cuando se generan varios UUID en rápida sucesión o si se ajusta el reloj del sistema.
-
Nodo: 6 bytes (12 caracteres hexadecimales), que normalmente representan la dirección MAC del nodo generador.
Tipos de UUID
Versión 1: UUID basados en tiempo que utilizan una combinación de la marca de tiempo actual y la dirección MAC del nodo generador. Esta versión garantiza la singularidad en el espacio y el tiempo.
Versión 2: Similar a la versión 1 pero incluye identificadores de dominio local; sin embargo, se usa con menos frecuencia debido a sus limitaciones.
Versión 3: UUID basados en nombres generados utilizando un hash MD5 de un identificador de espacio de nombres y un nombre.
Versión 4: UUID generados aleatoriamente que proporcionan alta aleatoriedad y unicidad, con solo unos pocos bits reservados para el control de versiones.
Versión 5: Como la versión 3, pero usa SHA-1 para hash, lo que la hace más segura que la versión 3.
Variantes
El campo variante en un UUID determina su diseño e interpretación. Las variantes más comunes incluyen:
-
Variante 0: Reservado para compatibilidad con versiones anteriores de NCS.
-
Variante 1: El diseño estándar utilizado para la mayoría de los UUID.
-
Variante 2: Se utiliza para UUID de seguridad DCE, que son menos comunes.
-
Variante 3: Reservado para futuras definiciones.
Ejemplo
Para la Versión 4, un UUID podría verse así:
550e8400-e29b-41d4-a716-446655440000
Aquí:
-
41d4 indica que es una versión 4.
-
a7 representa la variante, en este caso, la variante común "Leach-Salz".
Cómo se calculan los UUID
-
Versión 1 (basada en tiempo):
- La marca de tiempo suele ser el número de intervalos de 100 nanosegundos desde el 15 de octubre de 1582 (la fecha de la reforma del calendario gregoriano).
- El nodo es la dirección MAC de la máquina que genera el UUID.
- La secuencia del reloj ayuda a garantizar la unicidad cuando cambia la hora del reloj (por ejemplo, debido a reinicios del sistema).
-
Versión 3 y Versión 5 (basada en nombre):
- Un espacio de nombres (como un dominio DNS) se combina con un nombre (como una ruta de archivo o URL) y se aplica un hash.
- El hash (MD5 para la versión 3, SHA-1 para la versión 5) luego se estructura en un formato UUID, lo que garantiza que los campos de versión y variante estén configurados correctamente.
-
Versión 4 (basada en aleatorio):
- Se generan números aleatorios o pseudoaleatorios para los 122 bits del UUID.
- Los campos de versión y variante se configuran en consecuencia, lo que garantiza el cumplimiento de los estándares UUID.
Ejemplo de cálculo de UUIDv4
Paso 1: Genera 128 bits aleatorios
Supongamos que generamos el siguiente valor aleatorio de 128 bits:
11001100110101101101010101111010101110110110111001011101010110110101111011010011011110100100101111001011
Paso 2: Aplicar versión y variante de UUIDv4
Versión: Reemplace los bits 12-15 (cuarto carácter) con 0100 (para UUID versión 4).
Original: 1100 se convierte en 0100 → Valor actualizado en esta posición.
Variante: Reemplace los bits 6-7 del noveno byte con 10 (para la variante RFC 4122).
Original: 11 se convierte en 10 → Valor actualizado en esta posición.
Paso 3: Formatear en hexadecimal
Convierte el binario de 128 bits en 5 grupos hexadecimales:
- Grupo de 32 bits: 11001100110101101101010101111010 → ccda55ba
- Grupo de 16 bits: 1011101101101110 → b76e
- Grupo de 16 bits: 0100010101000101 → 4545 (con 0100 para la versión 4)
- Grupo de 16 bits: 1010110111110010 → adf2 (con 10 para la variante)
- Grupo de 48 bits: 11010011011110100100101111001011 → d39d25cb
Paso 4: Combina los grupos
El UUID final se vería así:
ccda55ba-b76e-4545-adf2-d39d25cb