Génération de chaînes alphanumériques (pseudo) aléatoires


85

Comment puis-je générer une chaîne alphanumérique (pseudo) aléatoire, quelque chose comme: 'd79jd8c' en PHP?


La solution est courte et unique. Reportez-vous à ce lien stackoverflow.com/a/34467730/4345141
Saud Khan

La méthode Random::alphanumericString($length)fait ce que vous voulez. Si vous voulez le construire vous-même, n'utilisez pas de source aléatoire autre que PHP intégrée random_bytesou random_int.
caw

Réponses:


164

Créez d'abord une chaîne avec tous vos caractères possibles:

 $characters = 'abcdefghijklmnopqrstuvwxyz0123456789';

Vous pouvez également utiliser range () pour le faire plus rapidement.

Ensuite, dans une boucle, choisissez un nombre aléatoire et utilisez-le comme index de la $characterschaîne pour obtenir un caractère aléatoire, et ajoutez-le à votre chaîne:

 $string = '';
 $max = strlen($characters) - 1;
 for ($i = 0; $i < $random_string_length; $i++) {
      $string .= $characters[mt_rand(0, $max)];
 }

$random_string_length est la longueur de la chaîne aléatoire.


9
Cette implémentation est également intéressante si vous souhaitez supprimer des caractères identiques tels que "l" et "1", "O" et "0". Cela vaut la peine lors de la génération de nouveaux mots de passe pour les utilisateurs.
Mark Nold

10
J'utilise également cette technique et supprime toutes les voyelles afin de ne pas donner accidentellement quelque chose d'impoli à quelqu'un pour un mot de passe.
nickf

10
Amélioration mineure: mt_rand()est un remplacement instantané pour rand(), et c'est mieux.
Grilse

11
L'exécution de strlen()chaque itération n'est pas bonne. Affectez strlen($characters) - 1à une variable et exécutez strlen hors du cycle. Pas critique dans ce cas, mais c'est juste Mauvais ton .
mintobit

6
Pensez à utiliser random_int si vous avez besoin d'un aléatoire sécurisé par cryptographie.
reallynice

18

J'aime cette fonction pour le travail

function randomKey($length) {
    $pool = array_merge(range(0,9), range('a', 'z'),range('A', 'Z'));

    for($i=0; $i < $length; $i++) {
        $key .= $pool[mt_rand(0, count($pool) - 1)];
    }
    return $key;
}

echo randomKey(20);

14

Générez une chaîne de 8 caractères aléatoire (potentiellement) forte d'un point de vue cryptographique à l'aide de la fonction openssl_random_pseudo_bytes :

echo bin2hex(openssl_random_pseudo_bytes(4));

Voie procédurale:

function randomString(int $length): string
{
    return bin2hex(openssl_random_pseudo_bytes($length));
}

Mise à jour:

PHP7 a introduit les random_x()fonctions qui devraient être encore meilleures. Si vous venez de PHP 5.X, utilisez l'excellente bibliothèque paragonie / random_compat qui est un polyfill pour random_bytes () et random_int () de PHP 7.

function randomString($length)
{
    return bin2hex(random_bytes($length));
}

7

Solution une ligne:

echo substr( str_shuffle( str_repeat( 'abcdefghijklmnopqrstuvwxyz0123456789', 10 ) ), 0, 7 );

Vous pouvez modifier le paramètre substr afin de définir une longueur différente pour votre chaîne.


4

Utilisez la table ASCII pour sélectionner une plage de lettres, où: $ range_start, $ range_end est une valeur de la colonne décimale dans la table ASCII.

Je trouve que cette méthode est plus agréable par rapport à la méthode décrite où la plage de caractères est spécifiquement définie dans une autre chaîne.

// range is numbers (48) through capital and lower case letters (122)
$range_start = 48;
$range_end   = 122;
$random_string = "";
$random_string_length = 10;

for ($i = 0; $i < $random_string_length; $i++) {
  $ascii_no = round( mt_rand( $range_start , $range_end ) ); // generates a number within the range
  // finds the character represented by $ascii_no and adds it to the random string
  // study **chr** function for a better understanding
  $random_string .= chr( $ascii_no );
}

echo $random_string;

En savoir plus:


1
C'est bien bien que les caractères non alphanumériques tombent dans cette plage ACSII.
Bower

4

Je sais que c'est un ancien article, mais j'aimerais contribuer avec une classe que j'ai créée sur la base de la réponse de Jeremy Ruten et améliorée avec des suggestions dans les commentaires:

    class RandomString
    {
      private static $characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
      private static $string;
      private static $length = 8; //default random string length

      public static function generate($length = null)
      {

        if($length){
          self::$length = $length;
        }

        $characters_length = strlen(self::$characters) - 1;

        for ($i = 0; $i < self::$length; $i++) {
          self::$string .= self::$characters[mt_rand(0, $characters_length)];
        }

        return self::$string;

      }

    }

3

Les gars simples ... mais rappelez-vous que chaque octet est aléatoire entre 0 et 255 ce qui pour une chaîne aléatoire sera très bien. N'oubliez pas que vous aurez deux caractères pour représenter chaque octet.

$str = bin2hex(random_bytes(32));  // 64 character string returned

De loin la meilleure réponse et le code le plus court! Cela devrait obtenir plus de votes positifs
Sliq


2

J'ai créé la fonction rapide suivante juste pour jouer avec la range()fonction. Cela pourrait simplement aider quelqu'un à un moment donné.

Function pseudostring($length = 50) {

    // Generate arrays with characters and numbers
    $lowerAlpha = range('a', 'z');
    $upperAlpha = range('A', 'Z');
    $numeric = range('0', '9');

    // Merge the arrays
    $workArray = array_merge($numeric, array_merge($lowerAlpha, $upperAlpha));
    $returnString = "";

    // Add random characters from the created array to a string
    for ($i = 0; $i < $length; $i++) {
        $character = $workArray[rand(0, 61)];
        $returnString .= $character;
    }

    return $returnString;
}

2

Vous pouvez utiliser le code suivant. Il est similaire aux fonctions existantes sauf que vous pouvez forcer le décompte de caractères spéciaux:

function random_string() {
    // 8 characters: 7 lower-case alphabets and 1 digit
    $character_sets = [
        ["count" => 7, "characters" => "abcdefghijklmnopqrstuvwxyz"],
        ["count" => 1, "characters" => "0123456789"]
    ];
    $temp_array = array();
    foreach ($character_sets as $character_set) {
        for ($i = 0; $i < $character_set["count"]; $i++) {
            $random = random_int(0, strlen($character_set["characters"]) - 1);
            $temp_array[] = $character_set["characters"][$random];
        }
    }
    shuffle($temp_array);
    return implode("", $temp_array);
}

1
function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}
echo generateRandomString();

1

Si vous voulez un moyen très simple de le faire, vous pouvez vous appuyer sur les fonctions PHP existantes. Voici le code que j'utilise:

substr( sha1( time() ), 0, 15 )

time()vous donne l'heure actuelle en secondes depuis l'époque, la sha1()chiffre en une chaîne de 0-9a-f et substr()vous permet de choisir une longueur. Vous n'êtes pas obligé de commencer au caractère 0, et quelle que soit la différence entre les deux nombres, la longueur de la chaîne sera la longueur de la chaîne.



0

La réponse de Jeremy est excellente. Si, comme moi, vous ne savez pas comment implémenter range (), vous pouvez voir ma version en utilisant range ().

<?php
$character_array = array_merge(range('a', 'z'), range(0, 9));
$string = "";
    for($i = 0; $i < 6; $i++) {
        $string .= $character_array[rand(0, (count($character_array) - 1))];
    }
echo $string;
?>

Cela fait exactement la même chose que Jeremy, mais utilise des tableaux fusionnés où il utilise une chaîne et utilise count () où il utilise strlen ().


2
ça doit êtrerange('a','z');
Mehdi Karamosly

0

1 ligne:

$FROM = 0; $TO = 'zzzz';
$code = base_convert(rand( $FROM ,base_convert( $TO , 36,10)),10,36);
echo $code;

0

La façon moderne de le faire avec le type hint / rand_int pour de vraies aléas

function random_string(int $size): string
{
    $characters = array_merge(
        range(0, 9),
        range('A', 'Z')
    );

    $string = '';
    $max = count($characters) - 1;
    for ($i = 0; $i < $size; $i++) {
        $string .= $characters[random_int(0, $max)];
    }

    return $string;
}

0

Commencez par lister les caractères souhaités

$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

Utilisez la fonction str_shuffle ($ string). Cette fonction vous fournira une chaîne aléatoire.

$alpha=substr(str_shuffle($chars), 0, 50);

50 est la longueur de la chaîne.


0
public function randomString($length = 8)
{
    $characters = implode([
        'ABCDEFGHIJKLMNOPORRQSTUWVXYZ',
        'abcdefghijklmnoprqstuwvxyz',
        '0123456789',
        //'!@#$%^&*?'
    ]);

    $charactersLength = strlen($characters) - 1;
    $string           = '';

    while ($length) {
        $string .= $characters[mt_rand(0, $charactersLength)];
        --$length;
    }

    return $string;
}

Vous avez un nombre différent de caractères dans les chaînes minuscules et majuscules. Et ce code présente-t-il des avantages par rapport à toutes les autres variantes déjà publiées ici?
magras
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.