uniqid()
Découvrez la fonction PHP uniqid() : syntaxe, paramètres, valeur de retour et alternatives sécurisées avec des exemples pratiques.
La fonction PHP uniqid() génère un identifiant de type string dérivé de l'heure actuelle en microsecondes. Cette page explique sa syntaxe et ses paramètres, à quoi ressemble réellement la valeur retournée, la mise en garde essentielle selon laquelle elle n'est pas adaptée aux jetons de sécurité, et ce qu'il faut utiliser à la place.
Ce que fait uniqid()
uniqid() retourne une chaîne hexadécimale de 13 caractères basée sur l'heure système actuelle, mesurée jusqu'à la microseconde. Comme l'horloge avance en permanence, deux appels effectués même une fraction de seconde d'intervalle produisent généralement des valeurs différentes, ce qui rend la fonction pratique pour des identifiants sans enjeu de sécurité tels que les noms de fichiers temporaires, les clés de cache ou les identifiants d'éléments DOM.
Il s'agit d'un identifiant basé sur le temps, et non d'un identifiant aléatoire. Cette distinction est importante : la valeur est prévisible, et sur une machine rapide, deux appels effectués dans la même microseconde retournent la même chaîne. Gardez cela à l'esprit avant de compter sur cette fonction pour l'unicité — et ne l'utilisez jamais pour la confidentialité.
Syntaxe
uniqid(string $prefix = "", bool $more_entropy = false): string| Paramètre | Type | Description |
|---|---|---|
$prefix | string | Texte ajouté au début de l'ID retourné. Utile lorsque plusieurs hôtes ou processus peuvent générer des IDs au même instant. Par défaut, une chaîne vide. |
$more_entropy | bool | Lorsque true, ajoute des caractères supplémentaires qui rendent le résultat moins susceptible de provoquer des collisions. Par défaut false. |
Valeur de retour : une string. Avec les arguments par défaut, elle fait 13 caractères ; avec $more_entropy défini à true, elle fait 23 caractères (la longueur du préfixe s'ajoute en plus des deux).
Utilisation de base
Appelez uniqid() sans arguments pour obtenir un ID brut basé sur un horodatage :
L'$id retourné est composé de 13 caractères hexadécimaux. Chaque exécution affiche une valeur différente car l'horodatage en microsecondes sous-jacent a évolué.
Ajout d'un préfixe
Passez une chaîne comme premier argument pour la préfixer à l'ID. Cela vous aide à distinguer les IDs générés dans différentes parties de votre application, ou sur différents serveurs :
Le préfixe n'est pas aléatoire — il est ajouté tel quel — donc il n'augmente pas l'unicité en lui-même. Son rôle est de cloisonner l'ID dans un espace de noms.
Plus d'entropie
Dans une boucle intensive, l'horodatage peut se répéter et vous pouvez obtenir des IDs en double. Définir le second argument à true ajoute des caractères supplémentaires (basés sur un générateur congruentiel linéaire combiné) pour réduire ce risque :
Avec $more_entropy activé, le résultat fait 23 caractères. Cela réduit le risque de collisions mais ne rend pas la valeur imprévisible pour autant.
Important : uniqid() n'est pas sécurisé
C'est l'erreur la plus courante avec uniqid(). Comme la valeur est dérivée de l'horloge, un attaquant qui connaît approximativement le moment où un ID a été créé peut le deviner. N'utilisez jamais uniqid() pour :
- les jetons de réinitialisation de mot de passe ou les jetons « magic link »
- les identifiants de session ou les clés API
- les jetons CSRF ou toute autre valeur sensible en termes de sécurité
Pour tout ce qui doit être imprévisible, utilisez une source cryptographiquement sécurisée. random_bytes() (PHP 7+) est le bon outil, éventuellement converti en chaîne lisible avec bin2hex() :
<?php
// 32-character, cryptographically secure random token
$token = bin2hex(random_bytes(16));
echo "Secure token: " . $token . "\n";
// e.g. Secure token: 93261fb1d3d843e8dac1d3372b4f3306
?>Si vous avez besoin d'un identifiant globalement unique dans un format standard, un UUID (via une bibliothèque telle que ramsey/uuid) est généralement plus adapté que uniqid().
Quand utiliser uniqid()
uniqid() convient bien lorsque vous avez besoin d'un label rapide et jetable et qu'un faible risque de collision est acceptable :
- noms de fichiers temporaires d'upload ou de cache
- attributs HTML
iduniques générés côté serveur - clés de courte durée dans des caches non critiques pour la sécurité
Pour les secrets imprévisibles, utilisez random_bytes() ; pour la génération aléatoire à usage général, consultez mt_rand() et rand() ; et si vous n'avez besoin que de l'horodatage haute résolution sous-jacent, regardez du côté de microtime().
Résumé
La fonction uniqid() produit un ID de 13 caractères (ou 23 avec $more_entropy) à partir de l'horodatage en microsecondes actuel. Elle est pratique pour les identifiants non sensibles à faible risque de collision, mais elle est prévisible par conception — pour les jetons de sécurité, préférez toujours random_bytes(). Choisir le bon outil pour chaque tâche garantit que vos IDs sont à la fois suffisamment uniques et, quand cela compte, impossibles à deviner.