Генератор случайных строк на PHP
Я пытаюсь создать случайную строку на PHP, и у меня абсолютно ничего не выводится. Вот мой код:
<?php
function RandomString()
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randstring = '';
for ($i = 0; $i < 10; $i++) {
$randstring = $characters[rand(0, strlen($characters))];
}
return $randstring;
}
RandomString();
echo $randstring;
?>
Что я делаю не так?
5 ответ(ов)
В зависимости от вашего приложения (например, если вы хотите генерировать пароли), вы можете использовать следующий код:
$string = base64_encode(openssl_random_pseudo_bytes(30));
Поскольку результат закодирован в base64, строка может содержать символы =
или -
, а также требуемые символы. Вы можете сгенерировать более длинную строку, а затем отфильтровать и обрезать её, чтобы удалить эти символы.
Функция openssl_random_pseudo_bytes
считается рекомендуемым способом генерации настоящих случайных чисел в PHP. Почему rand
не использует /dev/random
, я не знаю.
Вот простая однострочная команда, которая генерирует случайную строку без использования циклов на уровне скрипта или библиотек OpenSSL.
echo substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', mt_rand(1,10))), 1, 10);
Разберем её подробнее, чтобы параметры были понятны:
// Список символов для выбора
$chrList = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
// Минимальное и максимальное количество повторений списка символов для случайной выборки
$chrRepeatMin = 1; // Минимальное количество повторений строки
$chrRepeatMax = 10; // Максимальное количество повторений строки
// Длина возвращаемой случайной строки
$chrRandomLength = 10;
// ОДНОСТРОЧНАЯ команда для генерации случайной строки на основе вышеуказанных переменных.
echo substr(str_shuffle(str_repeat($chrList, mt_rand($chrRepeatMin, $chrRepeatMax))), 1, $chrRandomLength);
Этот метод работает, случайно повторяя список символов, затем перемешивает получившуюся строку и возвращает указанное количество символов.
Вы можете дополнительно рандомизировать длину возвращаемой строки, заменив $chrRandomLength
на mt_rand(8, 15)
(для случайной строки длиной от 8 до 15 символов).
Ваша функция generateRandomString
генерирует случайную строку фиксированной длины (по умолчанию 15 символов) с использованием хеш-функции sha1
. Рассмотрим код:
function generateRandomString($length = 15)
{
return substr(sha1(rand()), 0, $length);
}
Вот как работает этот код:
rand()
генерирует случайное целое число.sha1()
принимает это число и возвращает его хеш в виде 40-символьной строки в шестнадцатеричном формате.substr()
отрезает строку до заданной длины$length
и возвращает её.
Тем не менее, стоит отметить, что использование функции rand()
может привести к менее качественной случайности в некоторых сценариях. Для более сильной криптографической безопасности можно использовать random_int()
вместо rand()
. Вот обновленная версия функции:
function generateRandomString($length = 15)
{
return substr(sha1(random_int(0, PHP_INT_MAX)), 0, $length);
}
Таким образом, мы используем более безопасный способ генерации случайного числа. Успехов!
Вот мое простое однострочное решение для генерации удобного для пользователя случайного пароля, исключающего похожие символы, такие как "1" и "l", "O" и "0", "5" и "S" и т.д. В этом примере создается строка из 5 символов, но вы можете легко изменить это, изменив последнее значение:
$user_password = substr(str_shuffle('abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRTUVWXYZ2346789'), 0, 5);
Это, безусловно, не самый безопасный способ, так как количество различных символов ограничено, и каждый символ может использоваться в выводе только один раз. Тем не менее, строка длиной 5 символов все равно даст более 311 миллионов комбинаций, а строка длиной 7 символов — более 674 миллиардов комбинаций и т.д. Поэтому это все еще элегантный, удобный, легкий и простой в использовании метод для некритических задач.
В контексте функции $randstring
находится в своей локальной области видимости и не является тем же самым элементом, который вы пытаетесь использовать в месте вызова функции. Поэтому вам нужно присвоить возвращаемое значение переменной.
Пример:
$randstring = RandomString();
echo $randstring;
Или вы можете сразу вывести возвращаемое значение:
echo RandomString();
Также в вашей функции есть небольшая ошибка. Внутри цикла for
вам нужно использовать оператор .=
для добавления каждого символа к строке. Если вы используете просто =
, вы затираете предыдущее значение, присваивая новое значение вместо добавления.
Правильный код будет выглядеть так:
$randstring .= $characters[rand(0, strlen($characters) - 1)];
Обратите внимание, что нужно также корректно обработать индекс при вызове rand()
, чтобы не выйти за пределы строки $characters
.
Генерация случайной строки/символов в JavaScript
Генерация случайной строки с заглавными буквами и цифрами
Функции startsWith() и endsWith() в PHP
Удалить пустые элементы массива
Как сгенерировать случайную алфавитно-цифровую строку