2009-09-08 5 views
2

Je songe en utilisant ceci: http://phpgoogle.blogspot.com/2007/08/four-ways-to-generate-unique-id-by-php.htmlGénérer un identifiant de commande vraiment unique en PHP?

Mon idée est d'utiliser un mélange entre 2 et 3. Mais ma question est que, même si les chances sont petites, est-il encore une chance que deux commandes avec le même ordre # peut être généré si je sous-entends le résultat à seulement 5 caractères? Qu'en est-il de 3? 2? 1? Sûrement si c'est 1, il y a 1/(26 + 10) chances que l'identifiant soit le même?

+0

le premier exemple de code au lien affiché est déjà la merde: il a oublié la citation de vente autour de sa chaîne (je ne pense pas que ce soit une constante) – knittl

Répondre

4

en supposant que votre utilisateurs sont authentifiés et ont un nom d'utilisateur:

$unique_id = time() . mt_rand() . $userid; 

Si le même utilisateur demande cette page une deuxième fois dans la même seconde, il y aura toujours une chance de 1 dans mt_getrandmax(), ce qui sur mon ordinateur renvoie 2147483647. Vous pouvez probablement vivre avec cela?

Si vos utilisateurs ne sont pas authentifiés, vous pouvez utiliser un hash de leur adresse IP à la place si vous le souhaitez.

4

Pourquoi avez-vous besoin d'un identifiant unique?

Si vous souhaitez générer un ID unique dans votre base de données, laissez-le à votre base de données en utilisant l'incrémentation automatique.

De toute façon, vous pouvez utiliser une combinaison de microtime() et rand(). Vous êtes plutôt unique.

Modifier, par rapport au commentaire de l'OP:

Vous ne pouvez pas avoir un "toujours unique" si. Ou si vous trouvez comment, vous gagnerez un prix de turing.

Encore meilleures approches mathématiques vous laisse avec un goût de "oui mais une fois en 15645736536475 fois, je vais me faire défoncer".

Le seul moyen est d'avoir un compteur, que vous incrémentez chaque fois que vous avez besoin d'un nouvel ID. C'est comme ça que font les DB. Pourquoi avez-vous besoin de l'Id avant de l'insérer?

+0

Je veux un identifiant unique avant que je livre à la db. Et je suis d'accord, ce serait "plutôt unique". Comment puis-je en obtenir un qui est TOUJOURS unique, sans le stocker dans une base de données. – coderama

+0

Comment pensez-vous que cela soit possible? Pour générer un "identifiant toujours unique", vous devez non seulement connaître tous les identifiants qui ont été générés auparavant, mais aussi tous les identifiants qui seront générés ... Amusez-vous à trouver comment faire cela ... – fresskoma

+2

@ x3ro : c'est un peu exagéré ... si vous supposez que l'algorithme lui-même ne change pas, alors vous pouvez garantir un identifiant unique en connaissant * soit * tous les ID passés * ou * tous les identifiants futurs. Et avec notre technologie actuelle, la première est plus facile à mettre en œuvre! –

1

pris de manpage de uniqid PHP:

$better_token = md5(uniqid(mt_rand(), true)); 

bien qu'il pourrait être préférable de laisser le md5 -partie out (réduit le nombre de jetons à 2^128)

si vous utilisez un base de données, alors oui, vous devez laisser votre SGBD gérer la génération de iD

3

Si vous utilisez une chaîne aléatoire alors oui, il est théoriquement possible que deux ID soient identiques. C'est pourquoi une longue chaîne aléatoire est utilisée pour rendre cette possibilité si improbable qu'elle soit acceptable. Les probabilités peuvent être calculées: par exemple si un ID est composé de l'heure actuelle (à la seconde près) et d'une chaîne alphanumérique aléatoire de 5 caractères, et si 3 ID sont générés dans la même seconde, alors les probabilités de deux (ou plus) étant la même chose est: 1 - (38^5!/(38^5-3)!/38^5^3) = 3.79e-8. La plupart des gens seraient d'accord que ces chances sont pas assez bas pour des applications pratiques, ce qui explique pourquoi la page que vous avez lié suggère plutôt 10 caractères.

Si vous avez un ID de session, un nom d'utilisateur, etc., vous pouvez l'utiliser dans l'ID de la commande pour vous aider.

+0

Je suis d'accord avec l'approche mathématique. IMO 1E-15 ** début ** pour être acceptable. –

1

Vous pouvez utiliser le hachage de microtime et sha256, ou sans hachage.

$generate_order_id = hash('sha256', microtime()); 
Questions connexes