10

Генератор случайных строк на PHP

19

Я пытаюсь создать случайную строку на 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 ответ(ов)

0

В зависимости от вашего приложения (например, если вы хотите генерировать пароли), вы можете использовать следующий код:

$string = base64_encode(openssl_random_pseudo_bytes(30));

Поскольку результат закодирован в base64, строка может содержать символы = или -, а также требуемые символы. Вы можете сгенерировать более длинную строку, а затем отфильтровать и обрезать её, чтобы удалить эти символы.

Функция openssl_random_pseudo_bytes считается рекомендуемым способом генерации настоящих случайных чисел в PHP. Почему rand не использует /dev/random, я не знаю.

0

Вот простая однострочная команда, которая генерирует случайную строку без использования циклов на уровне скрипта или библиотек 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 символов).

0

Ваша функция generateRandomString генерирует случайную строку фиксированной длины (по умолчанию 15 символов) с использованием хеш-функции sha1. Рассмотрим код:

function generateRandomString($length = 15)
{
    return substr(sha1(rand()), 0, $length);
}

Вот как работает этот код:

  1. rand() генерирует случайное целое число.
  2. sha1() принимает это число и возвращает его хеш в виде 40-символьной строки в шестнадцатеричном формате.
  3. substr() отрезает строку до заданной длины $length и возвращает её.

Тем не менее, стоит отметить, что использование функции rand() может привести к менее качественной случайности в некоторых сценариях. Для более сильной криптографической безопасности можно использовать random_int() вместо rand(). Вот обновленная версия функции:

function generateRandomString($length = 15)
{
    return substr(sha1(random_int(0, PHP_INT_MAX)), 0, $length);
}

Таким образом, мы используем более безопасный способ генерации случайного числа. Успехов!

0

Вот мое простое однострочное решение для генерации удобного для пользователя случайного пароля, исключающего похожие символы, такие как "1" и "l", "O" и "0", "5" и "S" и т.д. В этом примере создается строка из 5 символов, но вы можете легко изменить это, изменив последнее значение:

$user_password = substr(str_shuffle('abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRTUVWXYZ2346789'), 0, 5);

Это, безусловно, не самый безопасный способ, так как количество различных символов ограничено, и каждый символ может использоваться в выводе только один раз. Тем не менее, строка длиной 5 символов все равно даст более 311 миллионов комбинаций, а строка длиной 7 символов — более 674 миллиардов комбинаций и т.д. Поэтому это все еще элегантный, удобный, легкий и простой в использовании метод для некритических задач.

0

В контексте функции $randstring находится в своей локальной области видимости и не является тем же самым элементом, который вы пытаетесь использовать в месте вызова функции. Поэтому вам нужно присвоить возвращаемое значение переменной.

Пример:

$randstring = RandomString();
echo $randstring;

Или вы можете сразу вывести возвращаемое значение:

echo RandomString();

Также в вашей функции есть небольшая ошибка. Внутри цикла for вам нужно использовать оператор .= для добавления каждого символа к строке. Если вы используете просто =, вы затираете предыдущее значение, присваивая новое значение вместо добавления.

Правильный код будет выглядеть так:

$randstring .= $characters[rand(0, strlen($characters) - 1)];

Обратите внимание, что нужно также корректно обработать индекс при вызове rand(), чтобы не выйти за пределы строки $characters.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь