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?

UnkwnTech
la source
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.

Jeremy Ruten
la source
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);
azerafati
la source
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));
}
emix
la source
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.

Marco Panichi
la source
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:

Daniel
la source
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;

      }

    }
diegoiglesias
la source
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
David Young
la source
De loin la meilleure réponse et le code le plus court! Cela devrait obtenir plus de votes positifs
Sliq
2

J'ai peut-être manqué quelque chose ici, mais voici un moyen d'utiliser la fonction uniqid () .

Edward Fuller
la source
2
uniqidn'est en aucun cas aléatoire. C'est complètement prévisible. Cette question recherche très spécifiquement les chaînes pseudo-aléatoires.
meagar
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;
}
Peter
la source
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);
}
Salman A
la source
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();
Molla Rasel
la source
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.

DiMono
la source
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 ().

Josh Smith
la source
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;
HausO
la source
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;
}
lyrixx
la source
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.

Shravan M
la source
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;
}
Александр Маринов
la source
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