Генерация (псевдо) случайных буквенно-цифровых строк - PullRequest
81 голосов
/ 07 сентября 2008

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

Ответы [ 18 ]

159 голосов
/ 07 сентября 2008

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

 $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 - длина случайной строки.

18 голосов
/ 28 ноября 2015

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

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);
13 голосов
/ 24 февраля 2016

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

echo bin2hex(openssl_random_pseudo_bytes(4));

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

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

Обновление:

PHP7 представил функции random_x(), которые должны быть еще лучше. Если вы пришли из PHP 5.X, используйте отличную библиотеку paragonie / random_compat , которая является полифилом для random_bytes () и random_int () из PHP 7.

function randomString($length)
{
    return bin2hex(random_bytes($length));
}
6 голосов
/ 08 августа 2017

Однолинейное решение:

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

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

4 голосов
/ 13 ноября 2015

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

    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;

      }

    }
4 голосов
/ 07 сентября 2008

Используйте таблицу 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;

Смотрите больше:

2 голосов
/ 27 июня 2010

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

2 голосов
/ 29 апреля 2016

Я сделал следующую быструю функцию, чтобы поиграть с функцией 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;
}
2 голосов
/ 02 мая 2019

Простые ребята .... но помните, что каждый байт является случайным между 0 и 255, что для случайной строки будет хорошо. Также помните, что у вас будет два символа для представления каждого байта.

$str = bin2hex(random_bytes(32));  // 64 character string returned
1 голос
/ 16 апреля 2018

Если вы хотите очень простой способ сделать это, вы можете опираться на существующие функции PHP. Это код, который я использую:

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

time() показывает текущее время в секундах с начала эпохи, sha1() шифрует его до строки 0-9a-f, а substr() позволяет выбрать длину. Вам не нужно начинать с символа 0, и независимо от того, какая разница между двумя числами, будет длина строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...