Cette question n'est pas vraiment un problème qui cherche une solution, c'est plutôt une question de simple curiosité. La fonction PHP uniqid possède un drapeau more_entropy, pour rendre le résultat "plus unique". Cela m'a amené à me demander quelle est la probabilité que cette fonction produise le même résultat plus d'une fois quand more_entropy est vrai, et quand il ne l'est pas. En d'autres termes, dans quelle mesure uniqid est-il unique lorsque more_entropy est activé et lorsqu'il est désactivé ? Y a-t-il des inconvénients à ce que more_entropy soit activé en permanence ?
Réponses
Trop de publicités?Mise à jour, mars 2014 :
Tout d'abord, il est important de noter que uniquid
est un terme un peu inapproprié car il ne garantit pas un identifiant unique.
Par le Documentation PHP :
AVERTISSEMENT !
Cette fonction ne crée pas de chaîne aléatoire ou imprévisible. Cette fonction fonction ne doit pas être utilisée à des fins de sécurité. Utilisez une fonction/générateur aléatoire cryptographique et des fonctions de hachage cryptographiquement sécurisées. pour créer des identifiants sécurisés imprévisibles.
Et
Cette fonction ne génère pas de jetons cryptographiquement sécurisés. En fait, sans qu'aucun paramètre supplémentaire ne lui soit passé, la valeur de retour est peu différente de microtime() . Si vous avez besoin de générer des jetons cryptographiquement sécurisés, utilisez openssl_random_pseudo_bytes() .
En mettant more-entropy à true, on obtient une valeur plus unique, mais le temps d'exécution est plus long (bien qu'à un degré minime), selon la documentation :
S'il a la valeur TRUE, uniqid() ajoutera une entropie supplémentaire (en utilisant le générateur linéaire congruentiel combiné) à la fin du retour. générateur congruentiel linéaire combiné) à la fin du retour. ce qui augmente la probabilité que le résultat soit unique.
Notez la ligne increases the likelihood that the result will be unique
et non qui est la volonté garantie l'unicité.
Vous pouvez rechercher l'unicité à l'infini, jusqu'à un certain point, et l'améliorer à l'aide d'un nombre quelconque de routines de cryptage, en ajoutant sels et autres, tout dépend du but recherché.
Je vous recommande de regarder les commentaires sur le sujet principal de PHP, notamment :
http://www.php.net/manual/en/function.uniqid.php#96898
http://www.php.net/manual/en/function.uniqid.php#96549
http://www.php.net/manual/en/function.uniqid.php#95001
Ce que je recommande, c'est de travailler pourquoi vous avez besoin de l'unicité, est-ce pour la sécurité (c'est-à-dire pour ajouter à une routine de cryptage/embrouillage) ? C'est également le cas, Comment unique doit-il être ? Enfin, examinez la question de la vitesse. L'adéquation changera en fonction des considérations sous-jacentes.
Les choses ne sont uniques que si vous vérifiez qu'elles n'existent pas déjà. Peu importe la fonction que vous utilisez pour générer une chaîne de caractères ou un ID "aléatoire", si vous ne vérifiez pas deux fois qu'il ne s'agit pas d'un doublon, il y a toujours une chance ;)
Bien que uniqid soit basé sur l'heure actuelle, la mise en garde ci-dessus s'applique toujours - cela dépend simplement de l'endroit où vous utiliserez ces "identifiants uniques". L'indice de tout ceci se trouve là où il est dit "plus unique". Unique est unique est unique. Je ne comprends pas bien comment on peut avoir quelque chose qui soit plus ou moins unique !
En vérifiant comme ci-dessus, et en combinant tous ces éléments, vous obtiendrez quelque chose qui s'approche de l'unicité, mais tout dépend de l'endroit où les clés seront utilisées et du contexte. J'espère que cela vous aidera !
D'après les discussions sur cette fonction sur le site du manuel PHP :
Comme le notent d'autres personnes ci-dessous, sans préfixe et sans "entropie ajoutée", cette fonction fonction renvoie simplement l'horodatage UNIX avec compteur de microsecondes ajouté ajouté sous forme de nombre hexadécimal ; c'est plus ou plus ou moins juste microtime(), sous forme hexadécimale.
[...]
Il faut également noter que puisque microtime() ne fonctionne que sur les systèmes qui ont gettimeofday() > présent, ce qui n'est PAS le cas de Windows, uniqid() pourrait ne donner que l'horodatage UNIX à résolution d'une seconde dans un environnement Windows.
En d'autres termes, sans "more_entropy", la fonction est absolument horrible et ne devrait jamais être utilisée, point final. D'après la documentation, l'indicateur utilisera un "générateur linéaire congruentiel combiné" pour "ajouter de l'entropie". Eh bien, c'est un RNG plutôt faible. Donc je sauterais cette fonction entièrement et utiliserais quelque chose basé sur mt_rand avec une bonne graine pour les choses qui ne sont pas pertinentes pour la sécurité, et SHA-256 pour les choses qui le sont.
Sans le drapeau more_unique, il renvoie l'horodatage unix avec un compteur de microsecondes, donc si deux appels sont effectués à la même microseconde, ils renverront le même identifiant "unique".
A partir de là, il s'agit de savoir si cela est probable. La réponse est : pas vraiment, mais pas à un degré négligeable. Si vous besoin de un identifiant unique et que vous les générez souvent (ou que vous travaillez avec des données générées ailleurs), ne comptez pas sur le fait qu'il soit absolument unique.