Générer une chaîne aléatoire en PHP
Voici aujourd'hui une petite fonction (présente dans le PEJO framework) dont je me sers pour générer des chaînes aléatoires :
/**
* Generates a random string within a range of given characters.
* @param $length Length of the randomly generated string.
* @return string
*/
function GenerateRandomString($length = 8)
{
// 67 allowed characters.
$allowedCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_@$%*";
$randomKey = '';
for($i = 1; $i < = $length; $i++)
{
$randomKey .= $allowedCharacters[rand(0, 66)];
}
return $randomKey;
}
Libre à vous par la suite d'inclure (ou d'exclure) certains caractères que vous pourrez considérer comme gênant. Par exemple, si vous voulez insérer une chaîne aléatoire dans un fichier XML, on évitera le symbole chevron. ;)

Si j'étais toi, je ferais un count($chaine) pour le rand, comme ça si tu enlèves des caractères, pas besoin de changer le "66"...
Justement. Je n'ai pas utilisé cette fonction afin d'optimiser (très légèrement, certes) le code. En effet, une fois une chaîne donnée, on peut se passer du count. ;)
http://uk2.php.net/uniqid + hashage, c'est pas plus beautiful quand même ?
Et pourquoi ne pas déclarer une variable :
$count = count($chaine); avant la boucle for? Comme ça pas d'appel fonction à chaque itération mais une bonne flexibilité en cas de suppression/ajout de caractères
Pas mal simple et léger. Je suis aussi contre le count(), vu que la $chaine est mise en dur, on ne la changera pas souvent ;)
Pour optimiser, tu peux aussi utiliser mt_rand() au lieu de rand().
Pour avoir quelque chose "vraiment imprévisible", on peut faire ça sinon :
Exact. Merci Mazzu ! Pour info, la fonction mt_rand() est 4 fois plus rapide que la fonction rand(). Source : PHP.net.
Quant à ta fonction, je ne l'ai pas testée. Cependant, quelquechose me déplaît : le /dev/urandom, qui oblige le serveur à tourner sous Linux. Certes, généralement on a affaire à une architecture LAMP, mais il ne faut pas oublier que la majorité des développeurs utilisent un WAMP en développement... ;)