104 votes

Générer une chaîne aléatoire de 5 caractères

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.

171voto

Brad Christie Points 58505
 $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];
 

Exemple

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")

87voto

Matthew Points 25748

Si for boucles sont en rupture de stock, voici ce que j'aime utiliser:

 $s = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", 5)), 0, 5);
 

30voto

middaparka Points 33832

Un moyen rapide consiste à utiliser les caractères les plus volatils de la fonction uniqid .

Par exemple:

 $rand = substr(uniqid('', true), -5);
 

15voto

Archimedix Points 3595

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

8voto

Kristoffer la Cour Points 1202

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;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X