Génération de clé unique
Je cherche un moyen, plus précisément en PHP que je vais être garanti pour toujours obtenir une clé unique.
J'ai effectué les opérations suivantes:
strtolower(substr(crypt(time()), 0, 7));
Mais je n'ai trouvé qu'une fois dans un certain temps, je me retrouve avec un double de la clé (rarement, mais assez souvent).
J'ai aussi pensé à faire:
strtolower(substr(crypt(uniqid(rand(), true)), 0, 7));
Mais selon le site de PHP, uniqid() pourrait, si uniqid() est appelé deux fois dans la même microseconde, il pourrait générer la même clé. Je pense que l'ajout de rand() que c'est rare, mais toujours possible.
Après les lignes mentionnées ci-dessus, je suis également supprimer des caractères tels que L et O il est donc moins déroutant pour l'utilisateur. Ce peut-être en partie la cause pour les doublons, mais encore nécessaire.
Une option, j'ai une pensée de la création d'un site web qui va générer la clé, de les stocker dans une base de données, en s'assurant qu'il est complètement unique.
Toutes les autres pensées? Existe-il des sites qui le font déjà, en quelque sorte, de l'API ou juste retour de la clé. J'ai trouvé http://userident.com mais je ne sais pas si les clés seront complètement unique.
Cela doit s'exécuter en arrière-plan, sans intervention de l'utilisateur.
source d'informationauteur Darryl Hein
Vous devez vous connecter pour publier un commentaire.
Il y a seulement 3 façons de générer des valeurs uniques, ils ont plutôt être des mots de passe, les Identifiants, etc.:
Toute autre méthode n'est pas garantie. Gardez à l'esprit, à la base, vous êtes la génération d'un nombre binaire (c'est un ordinateur), mais ensuite, vous pouvez l'encoder au format Hexadécimal, Décimal, Base64, ou une liste de mots. Choisir un encodage qui s'adapte à votre utilisation. Généralement pour un utilisateur a entré les données que vous voulez de variation de Base32 (qui vous a fait allusion à l').
Remarque à propos de GUID: Ils acquièrent de la force de leur unicité, de leur longueur et de la méthode utilisée pour les produire. Rien de moins que de 128 bits n'est pas sécurisé. Au-delà de la génération de nombre aléatoire il y a des caractéristiques qui vont dans un GUID pour le rendre plus unique. Gardez à l'esprit qu'ils ne sont pratiquement unique, pas tout à fait unique. Il est possible, bien que pratiquement impossible d'avoir un double.
Mise à jour de la Note sur les GUID: Depuis la rédaction de ce que j'ai appris que de nombreux GUID générateurs d'utiliser un cryptographique sécurisé générateur de nombre aléatoire (difficile, voire impossible, de prévoir le prochain numéro est généré, et un pas de risque de se répéter). Il y a en fait 5 différents UUID algorithmes. Algorithme 4 est ce que Microsoft utilise actuellement pour le GUID de Windows génération de l'API. Un GUID Microsoft, qui est la mise en œuvre de l'UUID standard.
Mise à jour: Si vous voulez de 7 à 16 caractères, alors vous devez utiliser la méthode 2 ou 3.
Ligne de fond: Franchement il n'y a pas une telle chose comme tout à fait unique. Même si vous êtes allé avec un générateur séquentiel vous finiraient par manquer de stockage à l'aide de tous les atomes dans l'univers, donc la boucle de retour sur vous-même et de le répéter. Votre seul espoir serait la mort thermique de l'univers avant d'atteindre ce point.
Même le meilleur générateur de nombre aléatoire a une possibilité de répéter égal à la taille totale du nombre aléatoire de la production. Prendre un trimestre par exemple. C'est un générateur de bits aléatoires, et ses chances de se répéter, sont de 1 sur 2.
Donc, tout est une question de seuil de l'unicité. Vous pouvez avoir 100% d'unicité à 8 chiffres pour 1,099,511,627,776 nombres en utilisant une séquence et base32 encodage. Toute autre méthode qui ne nécessite pas de vérification par rapport à une liste de numéros passé, seulement a la cote égale à n/1,099,511,627,776 (où n=nombre de précédents numéros générés) de ne pas être unique.
De l'algorithme va entraîner des doublons.
Donc, pourrais-je vous suggérer que vous utilisez votre algorithme* et cochez simplement les doublons?
*Léger ajout: Si
uniqid()
peut être non-unique basé sur le temps, également inclure un compteur global que vous incrément après chaque invocation. De cette façon, quelque chose est différent, même dans la même microseconde.Sans l'écriture du code, ma logique serait:
Générer une chaîne de caractères aléatoires quelle qu'en soit acceptable de caractères que vous souhaitez.
Puis ajouter la moitié de l'impression de la date (partielles secondes et tout et tout) à l'avant et l'autre moitié à la fin (ou quelque part au milieu, si vous préférez).
Séjour JOLLY!
H
Si vous utilisez votre méthode originale, mais ajouter le nom d'utilisateur ou votre adresse de courrier électronique devant le mot de passe, il sera toujours unique si chaque utilisateur ne peut avoir qu'1 mot de passe.
Pourraient vous intéresser dans cet article qui traite de la même question: Guid-globally unique, mais des sous-chaînes de Guid ne sont pas.
J'ai l'habitude de faire comme ceci:
Je suppose qu'il y a quelques théorique trous, mais je n'ai jamais eu un problème avec la duplication. J'ai l'habitude de l'utiliser pour les mots de passe temporaires (comme après une réinitialisation de mot de passe) et il fonctionne assez bien pour que.
Comme Frank Kreuger commenté, aller avec un générateur de GUID.
Comme cette une
Je suis toujours pas à voir pourquoi les mots de passe doivent être unique? Quel est l'inconvénient si 2 de vos utilisateurs ont le même mot de passe?
C'est en supposant que nous parlons de mots de passe qui sont liées à des identifiants, et pas seulement les identifiants uniques. Si c'est ce que vous cherchez, pourquoi ne pas utiliser le Guid?
Vous pourriez être intéressé par Steve Gibson-le-haut-assurer la mise en œuvre d'un générateur de mot de passe (pas de source, mais il comporte une description détaillée de la façon dont il fonctionne) à https://www.grc.com/passwords.htm.
Le site crée d'énormes 64 caractères, mots de passe, mais, depuis qu'ils sont complètement aléatoires, vous pouvez facilement prendre les 8 premiers (ou plusieurs) personnages pour le moins sécurisé, mais "aussi aléatoire que possible" mot de passe.
EDIT: a partir de vos réponses, je vois que vous besoin de quelque chose de plus comme un GUID qu'un mot de passe, donc ce n'est probablement pas ce que vous voulez...
Je crois qu'une partie de votre problème est que vous essayez de nous une unique fonction pour deux utilisations... les mots de passe et l'identificateur de la transaction
ce sont vraiment deux différentes zones à problème et c'est vraiment pas le meilleur pour essayer de les traiter conjointement.
J'ai récemment voulu un rapide et aléatoire simple clé unique, j'ai donc fait la suivante:
Donc, en gros, j'ai le temps unix en quelques secondes et ajouter un md5 de la chaîne générée à partir de l'heure + nombre aléatoire. C'est pas le meilleur, mais pour peu que la fréquence des demandes, il est assez bon. C'est rapide et fonctionne.
J'ai fait un test où j'avais générer des milliers de clés et alors de regarder pour les répétitions et ayant environ 800 de clefs par seconde il n'y avait pas de répétitions, pas mal. Je suppose que ça dépend totalement de la fonction mt_rand()
Je l'utilise pour une enquête tracker où nous obtenons un taux de dépôt de l'ordre de 1000 enquêtes par minute... donc pour l'instant (croise les doigts) il n'y a pas de doublons. Bien sûr, le taux n'est pas constante (nous obtenir les soumissions à certains moments de la journée), donc ce n'est pas l'échec de la preuve ni la meilleure solution... l'astuce est d'utiliser une valeur ajoutée en tant que partie de la clé (dans mon cas, j'ai utilisé le temps(), mais pourrait être mieux).
Ingoring le cryptage de la partie qui n'a pas beaucoup à faire avec la création d'une valeur unique, j'ai l'habitude de l'utiliser:
Lorsqu'il est appelé dans le même processus de $compteur est augmenté si la valeur est toujours unique dans le même processus.
Lorsqu'il est appelé, dans différents processus, vous devez vraiment être malchanceux pour obtenir 2 microtime() avec les mêmes valeurs, pense que microtime() appelle habituellement ont des valeurs différentes aussi, lorsqu'il est appelé dans le même script.
J'ai l'habitude de faire une sous-chaîne de caractères aléatoire (aléatoire combien de caractères entre 8 32, ou du moins pour la commodité de l'utilisateur) ou le MD5 d'une certaine valeur, j'ai obtenu, ou le temps, ou une combinaison des deux. Pour plus de hasard, je ne MD5 de venir la valeur de (dites le nom de concaténer qu'avec le temps, MD5 encore, puis prendre l'aléatoire de sous-chaîne. Oui, vous pourrait obtenir l'égalité des mots de passe, mais ce n'est pas très probable.