Генерирование (псевдо) случайных буквенно-цифровых строк

Как я могу генерировать (псевдо) случайную буквенно-цифровую строку, например: «d79jd8c» в PHP?

Related of "Генерирование (псевдо) случайных буквенно-цифровых строк"

Сначала создайте строку со всеми вашими возможными символами:

$characters = 'abcdefghijklmnopqrstuvwxyz0123456789'; 

Вы также можете использовать range (), чтобы сделать это быстрее.

Затем в цикле выберите случайное число и используйте его как индекс строки $characters чтобы получить случайный символ, и добавьте его в строку:

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

$random_string_length – длина случайной строки.

Мне нравится эта функция для работы

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

Я знаю, что это старая должность, но я бы хотел внести свой вклад в создание класса, основанного на ответе Джереми Рутена, и улучшился с предложениями в комментариях:

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

Создайте криптографически сильную, случайную (потенциально) 8- значную строку, используя функцию openssl_random_pseudo_bytes :

 echo bin2hex(openssl_random_pseudo_bytes(4)); 

Процедурный способ:

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

Используйте таблицу ASCII для выбора диапазона букв, где: $ range_start, $ range_end – значение из десятичного столбца таблицы ASCII.

Я нахожу, что этот метод лучше по сравнению с описанным методом, где диапазон символов определен конкретно в другой строке.

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

Узнать больше:

  • функция chr
  • Функция mt_rand

Возможно, я пропустил что-то здесь, но вот способ использования функции uniqid () .

 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(); 

Вы можете использовать следующий код, скопированный из этой статьи . Он похож на существующие функции, за исключением того, что вы можете принудительно использовать специальный символ:

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

Я сделал следующую быструю функцию, чтобы просто поиграть с функцией range() . Это может когда-нибудь помочь кому-то.

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

Однострочное решение:

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

Вы можете изменить параметр substr, чтобы задать другую длину для вашей строки.

Это то, что я использую:

 $cryptoStrong = true; // can be false $length = 16; // Any length you want $bytes = openssl_random_pseudo_bytes($length, $cryptoStrong); $randomString = bin2hex($bytes); 

Здесь вы можете увидеть Документы для openssl_random_pseudo_bytes и Docs для bin2hex здесь

Ответ Джереми велик. Если, как и я, вы не знаете, как реализовать range (), вы можете увидеть мою версию с помощью 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; ?> 

Это делает то же самое, что и у Джереми, но использует объединенные массивы, где он использует строку, и использует count (), где использует strlen ().

1 строка:

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