uniqid()
Aprende sobre la función uniqid() de PHP: sintaxis, parámetros, valores devueltos y cuándo usarla en lugar de random_bytes().
La función uniqid() de PHP genera un ID de cadena derivado del tiempo actual en microsegundos. Esta página explica su sintaxis y parámetros, el aspecto real del valor devuelto, la advertencia fundamental de que no es adecuada para tokens de seguridad, y qué usar en su lugar.
Qué hace uniqid()
uniqid() devuelve una cadena hexadecimal de 13 caracteres basada en la hora actual del sistema, medida hasta el microsegundo. Dado que el reloj sigue avanzando, dos llamadas realizadas incluso una fracción de segundo aparte suelen producir valores diferentes, lo que hace que la función sea útil para identificadores de bajo riesgo como nombres de archivos temporales, claves de caché o IDs de elementos DOM.
Es un identificador basado en el tiempo, no uno aleatorio. Esa distinción importa: el valor es predecible, y en una máquina rápida dos llamadas en el mismo microsegundo devuelven la misma cadena. Téngalo en cuenta antes de depender de él para la unicidad — y nunca para la confidencialidad.
Sintaxis
uniqid(string $prefix = "", bool $more_entropy = false): string| Parámetro | Tipo | Descripción |
|---|---|---|
$prefix | string | Texto que se antepone al ID devuelto. Útil cuando varios hosts o procesos pueden generar IDs en el mismo instante. Por defecto es una cadena vacía. |
$more_entropy | bool | Cuando es true, añade caracteres adicionales que hacen más difícil que haya colisiones. Por defecto es false. |
Valor de retorno: una string. Con los argumentos predeterminados tiene 13 caracteres; con $more_entropy establecido en true tiene 23 caracteres (la longitud del prefijo se añade encima de ambos).
Uso básico
Llama a uniqid() sin argumentos para obtener un ID básico basado en marca de tiempo:
El $id devuelto tiene 13 caracteres hexadecimales. Cada ejecución imprime un valor diferente porque la marca de tiempo subyacente en microsegundos ha avanzado.
Añadir un prefijo
Pasa una cadena como primer argumento para anteponerla al ID. Esto te ayuda a distinguir los IDs generados en diferentes partes de tu aplicación, o en diferentes servidores:
El prefijo no es aleatorio — se añade literalmente — por lo que no aumenta la unicidad por sí solo. Su función es dar espacio de nombres al ID.
Más entropía
En un bucle muy activo, la marca de tiempo puede repetirse y puedes obtener IDs duplicados. Establecer el segundo argumento en true añade caracteres adicionales (basados en un generador congruencial lineal combinado) para reducir ese riesgo:
Con $more_entropy habilitado, el resultado tiene 23 caracteres. Esto reduce la probabilidad de colisiones, pero no hace que el valor sea impredecible.
Importante: uniqid() no es seguro
Este es el error más común con uniqid(). Como el valor se deriva del reloj, un atacante que sepa aproximadamente cuándo se creó un ID puede adivinarlo. Nunca uses uniqid() para:
- tokens de restablecimiento de contraseña o tokens de "enlace mágico"
- identificadores de sesión o claves de API
- tokens CSRF ni ningún otro valor sensible para la seguridad
Para cualquier cosa que deba ser impredecible, usa una fuente criptográficamente segura. random_bytes() (PHP 7+) es la herramienta adecuada, opcionalmente convertida en una cadena legible con bin2hex():
<?php
// 32-character, cryptographically secure random token
$token = bin2hex(random_bytes(16));
echo "Secure token: " . $token . "\n";
// e.g. Secure token: 93261fb1d3d843e8dac1d3372b4f3306
?>Si necesitas un identificador único globalmente en un formato estándar, un UUID (mediante una biblioteca como ramsey/uuid) suele ser una mejor opción que uniqid().
Cuándo usar uniqid()
uniqid() es una buena opción cuando necesitas una etiqueta rápida y desechable y un pequeño riesgo de colisión es aceptable:
- nombres de archivos temporales de carga o caché
- atributos
idde HTML únicos generados en el servidor - claves de corta duración en cachés no críticas para la seguridad
Para secretos impredecibles usa random_bytes(); para aleatoriedad de propósito general consulta mt_rand() y rand(); y si solo necesitas la marca de tiempo subyacente de alta resolución, echa un vistazo a microtime().
Resumen
La función uniqid() produce un ID de 13 caracteres (o 23 con $more_entropy) a partir de la marca de tiempo del microsegundo actual. Es conveniente para identificadores no sensibles con baja probabilidad de colisión, pero es predecible por diseño — para tokens de seguridad siempre prefiere random_bytes(). Elegir la herramienta adecuada para cada tarea mantiene tus IDs lo suficientemente únicos y, donde importa, imposibles de adivinar.