W3docs

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ámetroTipoDescripción
$prefixstringTexto 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_entropyboolCuando 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:

php— editable, runs on the server

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:

php— editable, runs on the server

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:

php— editable, runs on the server

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 id de 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.

Práctica

Práctica
¿Cuál es la función de uniqid() en PHP?
¿Cuál es la función de uniqid() en PHP?
Was this page helpful?