Je veux créer une chaîne exacte de 5 caractères aléatoires avec le moins de possibilités d'obtenir une duplication. Quelle serait la meilleure façon de le faire? Merci.
Réponses
Trop de publicités? $rand = substr(md5(microtime()),rand(0,26),5);
Ce serait ma meilleure hypothèse - à moins que vous ne recherchiez des caractères spéciaux aussi:
$seed = str_split('abcdefghijklmnopqrstuvwxyz'
.'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
.'0123456789!@#$%^&*()'); // and any other characters
shuffle($seed); // probably optional since array_is randomized; this may be redundant
$rand = '';
foreach (array_rand($seed, 5) as $k) $rand .= $seed[$k];
Et, pour l'un basé sur l'horloge (moins de collisions puisque c'est incrémental):
function incrementalHash($len = 5){
$charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
$base = strlen($charset);
$result = '';
$now = explode(' ', microtime())[1];
while ($now >= $base){
$i = $now % $base;
$result = $charset[$i] . $result;
$now /= $base;
}
return substr($result, -5);
}
Remarque: incrémentiel signifie plus facile à deviner; Si vous utilisez ceci comme un sel ou un jeton de vérification, ne le faites pas. Un sel (maintenant) de "WCWyb" signifie dans 5 secondes à partir de maintenant c'est "WCWyg")
Un moyen rapide consiste à utiliser les caractères les plus volatils de la fonction uniqid .
Par exemple:
$rand = substr(uniqid('', true), -5);
Ce qui suit devrait fournir le moins de chance de duplication (vous pouvez remplacer mt_rand()
avec un meilleur nombre aléatoire sources, par exemple à partir d' /dev/*random
ou de Guid):
<?php
$characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
$result = '';
for ($i = 0; $i < 5; $i++)
$result .= $characters[mt_rand(0, 61)];
?>
EDIT:
Si vous êtes préoccupé par la sécurité, vraiment, ne pas utiliser rand()
ou mt_rand()
, et de vérifier que vos données aléatoires appareil est en fait un dispositif de génération aléatoire de données, pas un fichier régulier ou quelque chose de prévisible, comme /dev/zero
. mt_rand()
considérées comme nuisibles:
https://spideroak.com/blog/20121205114003-exploit-information-leaks-in-random-numbers-from-python-ruby-and-php
J'utilise toujours la même fonction pour cela, généralement pour générer des mots de passe. C'est facile à utiliser et utile.
function randPass($length, $strength=8) {
$vowels = 'aeuy';
$consonants = 'bdghjmnpqrstvz';
if ($strength >= 1) {
$consonants .= 'BDGHJLMNPQRSTVWXZ';
}
if ($strength >= 2) {
$vowels .= "AEUY";
}
if ($strength >= 4) {
$consonants .= '23456789';
}
if ($strength >= 8) {
$consonants .= '@#$%';
}
$password = '';
$alt = time() % 2;
for ($i = 0; $i < $length; $i++) {
if ($alt == 1) {
$password .= $consonants[(rand() % strlen($consonants))];
$alt = 0;
} else {
$password .= $vowels[(rand() % strlen($vowels))];
$alt = 1;
}
}
return $password;
}