56 votes

Comment créer une chaîne aléatoire en utilisant PHP?

Je sais que la fonction rand en PHP génère aléatoirement des nombres entiers, mais quelle est la meilleure façon de générer une chaîne de caractères aléatoires, telles que:

Chaîne d'origine, 9 caractères

$string = 'abcdefghi';

Exemple de chaîne de caractères aléatoires en limitant à 6 caractères

$string = 'ibfeca';

Mise à JOUR: j'ai trouvé des tonnes de ces types de fonctions, fondamentalement, je suis en train d'essayer de comprendre la logique derrière chaque étape.

Mise à JOUR: La fonction est de générer une quantité de caractères que nécessaire.

Veuillez commenter les parties si vous avez la réponse.

98voto

Gumbo Points 279147

Si vous souhaitez autoriser répétitif occurences de caractères, vous pouvez utiliser cette fonction:

function randString($length, $charset='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')
{
    $str = '';
    $count = strlen($charset);
    while ($length--) {
        $str .= $charset[mt_rand(0, $count-1)];
    }
    return $str;
}

L'algorithme de base est de générer <longueur> fois un nombre aléatoire entre 0 et <nombre de caractères> − 1 on utilise comme index pour choisir un personnage à partir de notre jeu et de concaténer ces personnages. Le 0 et <nombre de caractères> − 1 limites représentent les limites de l' $charset chaîne de caractères comme le premier caractère est abordée $charset[0] et la dernière avec $charset[count($charset) - 1].

91voto

Chad Birch Points 39087

Eh bien, vous n'avez pas de clarifier toutes les questions que j'ai posées dans mon commentaire, mais je vais supposer que vous voulez une fonction qui peut prendre une corde de "possible" des personnages et une longueur de chaîne de retour. Commenté abondamment, comme demandé, à l'aide de plus de variables que je l'aurais fait normalement, pour plus de clarté:

function get_random_string($valid_chars, $length)
{
    // start with an empty random string
    $random_string = "";

    // count the number of chars in the valid chars string so we know how many choices we have
    $num_valid_chars = strlen($valid_chars);

    // repeat the steps until we've created a string of the right length
    for ($i = 0; $i < $length; $i++)
    {
        // pick a random number from 1 up to the number of valid chars
        $random_pick = mt_rand(1, $num_valid_chars);

        // take the random character out of the string of valid chars
        // subtract 1 from $random_pick because strings are indexed starting at 0, and we started picking at 1
        $random_char = $valid_chars[$random_pick-1];

        // add the randomly-chosen char onto the end of our string so far
        $random_string .= $random_char;
    }

    // return our finished random string
    return $random_string;
}

Pour appeler cette fonction avec vos données d'exemple, vous pourriez dire quelque chose comme:

$original_string = 'abcdefghi';
$random_string = get_random_string($original_string, 6);

Notez que cette fonction ne vérifie pas pour l'unicité dans l'valide caractères transmis. Par exemple, si vous l'avez appelé un motif valable de caractères chaîne de 'AAAB', il serait trois fois plus susceptibles de choisir un Un pour chaque lettre de B. Qui pourrait être considéré comme un bug ou une fonctionnalité, en fonction de vos besoins.

52voto

tasmaniski Points 1681

Mon préféré:

  echo substr(md5(rand()), 0, 7);
 

6voto

Imran Points 20117

Rejoindre caractères à la fin devrait être plus efficace que l'exposition répétée à la concaténation de chaîne.

Edit #1: Ajout d'une option pour éviter le caractère de répétition.

Edit #2: Throws exception pour éviter d'entrer dans une boucle infinie si $norepeat est sélectionné et $len est plus grand que le jeu de caractères à choisir.

Edit #3: Utilise la matrice de touches pour stocker choisi de caractères aléatoires lorsque $norepeat est sélectionné, en tant que tableau associatif clé de recherche est plus rapide que de façon linéaire à la recherche de la matrice.

function rand_str($len, $norepeat = true)
{
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    $max = strlen($chars) - 1;

    if ($norepeat && len > $max + 1) {
        throw new Exception("Non repetitive random string can't be longer than charset");
    }

    $rand_chars = array();

    while ($len) {
        $picked = $chars[mt_rand(0, $max)];

        if ($norepeat) {
            if (!array_key_exists($picked, $rand_chars)) {
                $rand_chars[$picked] = true;
                $len--;
            }
        }
        else {
            $rand_chars[] = $picked;
            $len--;
        }
    }

    return implode('', $norepeat ? array_keys($rand_chars) : $rand_chars);   
}

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: