PHP7. Генерация случайной строки

Данный материал предоставлен сайтом PacificSky.Ru исключительно в ознакомительных целях. Администрация не несет ответственности за его содержимое.
Многие программисты сталкиваются с необходимостью генерации случайной (рандомной) строки, но решения доступные в интернете оказываются громоздкими или имеют медленную скорость исполнения.
С момента появления PHP7 получить случайную строку на много проще.



Похожая, полная версия функции с поддержкой различных версий PHP мне встречалась в Laravel Framework.
В данной статье будет описана данная функция, но в более урезанном виде (только для php7), за счет появления функции random_bytes.
Если вам необходима данная функция для других версий языка, то ищите как получить random_bytes (рандомные байты).

Переходим к разбору функции:

Пока длина полученной строки менее необходимой длины
while (($len = strlen($string)) < $length) {

Получаем размер случайной строки
$size = $length - $len;

Функция random_bytes формирует криптографические безопасные псевдослучайные байты.
$bytes = random_bytes($size);

Функция base64_encode кодирует полученные псевдослучайные байты алгоритмом MIME base64 и функция str_replace выполняет замену (удаляет) лишние символы ('/', '+', '=').
str_replace(['/', '+', '='], '', base64_encode($bytes))


Применив функцию substr, возвращаем подстроку с 0 позиции до позиции указанной в переменной $size (рассмотрено ранее).
$string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size);

В итоге, пройдя весь цикл while, мы получаем произвольную строку, размером указанном в параметре функции str_random()
$string .= 

Код функции:
function str_random($length)
{
    $string = '';

    while (($len = strlen($string)) < $length) {
        $size = $length - $len;

        $bytes = random_bytes($size);

        $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size);
    }

    return $string;
}


Пример работы функции:
Запрашиваем случайную строку размером из 8 символов.
var_dump(str_random(8));

Результат:
string(8) "0cDuRI2T" 

Код функции на gitHub
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.