Générer une chaîne aléatoire sans boucle ni cryptage (md5 ou autre)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 424 fois - Téléchargée 17 fois

Contenu du snippet

Jusqu'à présent tous les générateurs de clé que j'ai trouvé utilisait une boucle ou les fonction sha1, md5...

Donc je voulais présenter une autre technique qui me semble plus simple et plus flexible pour générer des chaînes aléatoires qui utilise uniquement des fonctions de manipulation de chaînes.

Source / Exemple :


define('ALPHABET','azertyuiopqsdfghjklmwxcvbn'); //Entrez les caractères que vous voulez
$longueur=8;
$cle=substr(str_shuffle(str_repeat(ALPHABET,$longueur)),0,$longueur);
// str_repeat(ALPHABET,$longueur) répète l'alphabet 8 fois pour permettre à une lettre d'apparaître plusieurs fois
// str_shuffle(...) mélange la source de lettres
// substr(...,0,$longueur) prélève les 8 premiers caractères

Conclusion :


PHP 4.3 est nécessaire

A voir également

Ajouter un commentaire

Commentaires

kylekatarnls
Messages postés
35
Date d'inscription
dimanche 4 février 2007
Statut
Membre
Dernière intervention
1 juillet 2008
-
Merci GillesWebmaster pour ton encouragement et je tiens à le rappeler, c'est bien une chaîne aléatoire et non une clé unique.
GillesWebmaster
Messages postés
507
Date d'inscription
mercredi 30 juin 2004
Statut
Membre
Dernière intervention
29 juillet 2009
1 -
Mais bon l'idée est bonne même si la chaine ne sera jamais (théoriquement) unique; savoir sortir des chemins battus est parfois une bonne idée; encourageons cela, nous autres programmeurs bornées ;-)
GillesWebmaster
Messages postés
507
Date d'inscription
mercredi 30 juin 2004
Statut
Membre
Dernière intervention
29 juillet 2009
1 -
Tout ça reste théorique car vous oubliez encore l'analyse combinatoire de la fonction str_shuffle()!
kylekatarnls
Messages postés
35
Date d'inscription
dimanche 4 février 2007
Statut
Membre
Dernière intervention
1 juillet 2008
-
La multiplication de l'alphabet par la longueur sert à obtenir l'équiprobabilité de chaque caractère. Ce n'est pas tout à fait exact mais au moins une lettre peut se trouver en double dans le code (ce qui fait 26 puissance 8 possibilité) alors que si on prend un seul alphabet, les lettres n'apparaissent qu'une seule fois (et on a 26! possibilité) ce qu'estimait COUCOU747 qui n'a pas du voir le str_repeat. Après c'est à l'utilisateur de juger où est son intérêt, pour la constante en effet, c'est le genre d'habitude que j'ai du mal à prendre.
aKheNathOn
Messages postés
285
Date d'inscription
dimanche 22 juillet 2001
Statut
Modérateur
Dernière intervention
5 décembre 2013
-
ça serais pas un snippet ça ?

L'astuce semble sympa - quelques corrections ligne 3 : str_repeat et non str_reapeat. Il faudrait que t'expliques ton code ligne par ligne / voire fonction par fonction.

Tu définit un dico / puis une longeur.
1ére remarque :
le dico pourrais être dans une constante et la longeur un paramètre de fonction. Ca donnerais ça :

define('DICO', 'azertyuiopqsdfghjklmwxcvbn');
function genRandChar($length = 8) {
return substr(str_shuffle(str_repeat(DICO,$length)),0,$length);
}

Tu fait un str-repeat donc tu dupliques dans une chaine ton dico N fois. Ensuite tu lui demandes de mélanger l'ensemble de la chaîne str-shuffle. Puis tu prends depuis le début jusqu'à la longeur demandée.

A mon avis c'est pas bon - t'as 20 lettres dans le dico (je simplifie), tu veux un mot de passe de 8 lettres et tu lui demandes de mélanger 160 lettres (8 * 20) pour n'en retourner que les 8 premières. Pas bon au niveau perfs - fais un tour sur les commentaires de cette page :
http://fr2.php.net/manual/fr/function.str-shuffle.php

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.