Générer des codes uniques en PHP / MySQL?
Je suis en train de travailler avec un client qui a besoin de générer des millions de codes alphanumériques utilisés dans le magazine de gratter des cartes, bottlecap prix, et ainsi de suite. Ils doivent être suffisamment courts pour imprimer sur un cap, ils veulent s'assurer que des personnages ambigus comme 1 et I, 0 et S, etc. ne sont pas inclus, et ils doivent être explicitement stockées pour une utilisation future -- nous ne pouvons pas avoir un algorithme qui détermine la "validité" quand quelqu'un essaie de racheter un. Enfin, ils veulent s'assurer que les codes sont distribués de façon aléatoire à l'intérieur d'un grand "code de l'espace", de sorte que les gens ne peuvent pas deviner les autres codes en marchant à travers l'alphabet.
Sont là tous les pointeurs vers raisonnablement efficace des algorithmes pour générer ces types de jeux de code? J'ai gratté un peu sur le dos d'une enveloppe, mais ce problème sent comme un piège pour les imprudents.
source d'informationauteur Eaton
Vous devez vous connecter pour publier un commentaire.
Si vous avez besoin d'environ 10 millions de clés uniques (par exemple), la meilleure approche est de choisir un espace-clé qui est exponentielle, et commencer à générer aléatoirement. Lisez à propos de la Le Paradoxe D'Anniversaire -- c'est la principale chose que vous devriez être inquiet. Si vous voulez 2^n unique et sécurisé des clés, assurez-vous que il ya au moins 2^(2 * n) valeurs possibles. Voici une rude O(n log n) algorithme:
Pseudocode:
Supposons que vous pouvez utiliser un jeu de caractères, par exemple, 40 symboles de sans ambiguïté majuscules,en minuscules et des caractères numériques.
Pour une séquence de n caractères, vous avez 40n combinaisons
Donc de 8 caractères donne un bon espace de travail - si vous avez généré 10 millions de codes, vous devriez essayer des centaines de milliers de combinaisons à la force brute d'un code.
Ou vous venez à partir de l'autre sens - donner le nombre de possible codes, le nombre de codes devrait que vous générez pour éviter le piège qu'ils appellent le Le Paradoxe D'Anniversaire?
En prenant les 8 char code, 6,553,600,000,000 est d'environ 242donc vous pourriez raisonnablement générer 221 codes d'elle, ou de 2 097 152 sommets
Utiliser un algorithme de mot de passe?
RFC4225 les détails de l'une basée sur l'algorithme HMAC.
http://www.ietf.org/rfc/rfc4226.txt
mais au lieu d'utiliser des chiffres de 0 à 9 base10 de codage, utilisation base32.
Whatver méthode que vous utilisez, je vous suggère d'ajouter un chiffre de contrôle ou deux, comme un "première ligne de défense contre les gens mal d'entrer ou de tenter d'inventer un certain nombre.
Curieusement, à la suite de la graine, j'ai seulement été en mesure de générer 32 chaînes uniques.
ABCDEFGHJKLMNPQRSTUVWXYZ23456789
Avec plus de seed, j'ai été en mesure de générer beaucoup plus de--généré de 40 000 chaînes uniques avec succès.
ABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789ABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789ABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789