¿Por qué necesita GUID/UUID y por qué es más fácil de lo que parece?
\n\n¿Alguna vez se ha preguntado cómo los sitios web y las aplicaciones distinguen un registro en la base de datos de otro? ¿O cómo su navegador recuerda que fue usted quien agregó algo al carrito, y no su vecino? El secreto a menudo se encuentra en una cadena pequeña pero poderosa: GUID (Globally Unique Identifier) o su hermano más preciso UUID (Universally Unique Identifier).
\n\nEn Stack Overflow, la pregunta «How do I create a GUID / UUID?» acumula miles de visitas. No es casualidad. Todo desarrollador, tarde o temprano, se enfrenta a la tarea: «Necesito un ID único, pero no quiero incluir una biblioteca entera». Hoy analizaremos este tema en JavaScript de principio a fin. No solo aprenderá cómo generar un UUID, sino que también comprenderá qué método elegir para su tarea.
\n\n¿Listo? ¡Allá vamos!
\n\n¿Qué es realmente un UUID? (y por qué no es magia)
\n\nAntes de escribir código, aclaremos la teoría. Un UUID es un número de 128 bits que normalmente se escribe en formato hexadecimal con guiones. Se ve así:
\n\n123e4567-e89b-12d3-a456-426614174000\n\nEl estándar RFC 4122 describe varias versiones de UUID. Las más populares son:
\n- \n
- Versión 4: UUID aleatorio. Casi todo lo que encontrará en Internet es de este tipo. \n
- Versión 1: Basado en la hora y la dirección MAC. Está obsoleto, pero a veces se encuentra. \n
- Versión 5: Se genera a partir de un nombre (por ejemplo, una URL) utilizando el hash SHA-1. \n
La propiedad principal de un UUID es la unicidad sin un servidor central. La probabilidad de colisión (coincidencia de dos ID) es tan baja que se puede ignorar. Se dice que si se generaran mil millones de UUID por segundo, se necesitarían unos 100 años para crear un duplicado. Una buena garantía, ¿verdad?
\n\nLa forma más correcta: crypto.randomUUID()
\n\nSi escribe JavaScript moderno (ES2020+), tiene a su disposición una solución integrada: crypto.randomUUID(). Este método está disponible en navegadores y Node.js (a partir de la versión 14.17.0).
\n\nAsí es como funciona:
\n\n// Navegador\nconst myUUID = crypto.randomUUID();\nconsole.log(myUUID); // Salida: "f47ac10b-58cc-4372-a567-0e02b2c3d479"\n\n// Node.js (versiones modernas)\nconst { randomUUID } = require('crypto');\nconst myUUID = randomUUID();\nconsole.log(myUUID);\n\n¿Por qué es la mejor opción?
\n- \n
- Seguridad: Utiliza un generador de números aleatorios criptográficamente seguro. Sin patrones predecibles. \n
- Estándar: Cumple estrictamente con RFC 4122 versión 4. \n
- Rendimiento: Está escrito en C++ internamente, funciona a la velocidad del rayo. \n
- Cero dependencias: No es necesario instalar bibliotecas de terceros. \n
Importante: En navegadores antiguos (Internet Explorer, Safari anteriores a 15.4), este método puede no estar disponible. Si necesita soportar a estos «dinosaurios», siga leyendo; tenemos opciones alternativas.
\n\nEl truco clásico: Math.random() + plantilla RFC 4122
\n\nAntes de la aparición de crypto.randomUUID(), los desarrolladores inventaban soluciones caseras. La opción más popular es usar Math.random() para sustituir dígitos en una plantilla de UUID. Este código ha circulado por Internet durante más de 10 años:
\n\nfunction generateUUID() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n}\n\nconsole.log(generateUUID()); // Salida: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"\n\n¿Cómo funciona?
\n- \n
- La plantilla
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxxdefine el formato. \n - El carácter 'x'