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:
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:
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.
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 :
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.
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;
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:
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
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.
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 ().
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?
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éerandom_bytes
ourandom_int
.Réponses:
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
$characters
chaî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.la source
mt_rand()
est un remplacement instantané pourrand()
, et c'est mieux.strlen()
chaque itération n'est pas bonne. Affectezstrlen($characters) - 1
à une variable et exécutez strlen hors du cycle. Pas critique dans ce cas, mais c'est juste Mauvais ton .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);
la source
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)); }
la source
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.
la source
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:
la source
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; } }
la source
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
la source
J'ai peut-être manqué quelque chose ici, mais voici un moyen d'utiliser la fonction uniqid () .
la source
uniqid
n'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.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; }
la source
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); }
la source
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();
la source
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, lasha1()
chiffre en une chaîne de 0-9a-f etsubstr()
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.la source
C'est quelque chose que j'utilise:
$cryptoStrong = true; // can be false $length = 16; // Any length you want $bytes = openssl_random_pseudo_bytes($length, $cryptoStrong); $randomString = bin2hex($bytes);
Vous pouvez voir les documents pour openssl_random_pseudo_bytes ici , et les documents pour bin2hex ici
la source
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 ().
la source
range('a','z');
1 ligne:
$FROM = 0; $TO = 'zzzz'; $code = base_convert(rand( $FROM ,base_convert( $TO , 36,10)),10,36); echo $code;
la source
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; }
la source
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.
la source
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