74 votes

Quel est le caractère unique de l'uniqid ?

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 ?

35voto

SW4 Points 26395

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.

15voto

danp Points 4502

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 !

10voto

Michael Borgwardt Points 181658

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.

7voto

Reese Moore Points 6213

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X