Я пытаюсь создать случайную строку в PHP, и я не получаю абсолютно ничего с этим:
<?php
function RandomString()
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randstring = '';
for ($i = 0; $i < 10; $i++) {
$randstring = $characters[rand(0, strlen($characters))];
}
return $randstring;
}
RandomString();
echo $randstring;
Что я делаю неправильно?
strlen($characters)
=>strlen($characters) - 1
- длина строки начинается с 1Ответы:
Чтобы ответить на этот вопрос конкретно, две проблемы:
$randstring
не входит в сферу, когда вы повторяете это.Вот фрагмент кода с исправлениями:
Выведите случайную строку с помощью вызова ниже:
источник
substr(str_shuffle(MD5(microtime())), 0, 10);
?rand()
наmt_rand()
. Я использовал ваш метод и столкнулся с кучей имен.Еще один способ.
ОБНОВЛЕНО (теперь это генерирует любую длину строки):
Вот и все. :)
источник
Есть много ответов на этот вопрос, но ни один из них не использует криптографически безопасный генератор псевдослучайных чисел (CSPRNG).
Простой, безопасный и правильный ответ - использовать RandomLib и не изобретать велосипед.
Для тех из вас, кто настаивает на изобретении собственного решения, PHP 7.0.0 предоставит
random_int()
для этой цели; если вы все еще используете PHP 5.x, мы написали полифил для PHP 5,random_int()
чтобы вы могли использовать новый API еще до обновления до PHP 7.Безопасное создание случайных целых чисел в PHP не является тривиальной задачей. Перед развертыванием собственного производственного алгоритма вы всегда должны проконсультироваться с местными специалистами по криптографии StackExchange .
С безопасным целочисленным генератором на месте генерация случайной строки с CSPRNG - прогулка в парке.
Создание безопасной случайной строки
Использование :
Демонстрация : https://3v4l.org/IMJGF (Игнорировать сбои PHP 5; требуется random_compat)
источник
$keyspace = str_shuffle($keyspace );
для большей безопасностиrandom_int()
вместоrand()
или неmt_rand()
добавляет сложности для разработчика. В то же время это дает им большую безопасность. Люди, которые приходят в StackOverflow в поисках быстрых решений, могут не знать, должна ли вещь, которую они строят, быть безопасной или нет. Если мы дадим им ответы по умолчанию, они создадут более безопасный Интернет, даже если, с их точки зрения, это совершенно случайно. Почему вы противостоите этой цели, для меня загадка.Это создает шестнадцатеричную строку длиной 20 символов:
В PHP 7 ( random_bytes () ):
источник
openssl_random_pseudo_bytes()
не использовал криптографически сильный алгоритм до php 5.6. Связанная ошибка: bugs.php.net/bug.php?id=70014openssl_random_pseudo_bytes()
вы ничего не получите обратно. Кроме того, обратите внимание, что при использовании,bin2hex(openssl_random_pseudo_bytes($length / 2))
так как вы работаете с целыми числами, он автоматически удалит модуль и будет использовать следующий наименьший кратный 2. Таким образом,$length = 19
получится строка длины 18.fgets($fp, 1024)
любой редактор файлов, у которого есть проблемы с очень длинными строками:function string_rand($len, $split="\n") { return substr(chunk_split(bin2hex(openssl_random_pseudo_bytes(ceil($len / 2))), 1023, $split), 0, $len); }
установите,$split
должноnull
ли оно возвращать одну строку . Таким образом, вы можете использовать его для обоих случаев.$string = substr(base64_encode(random_bytes($size)), 0, $size);
@tasmaniski: ваш ответ сработал для меня. У меня была такая же проблема, и я бы посоветовал ее тем, кто когда-либо ищет один и тот же ответ. Вот это от @tasmaniski:
Вот видео на YouTube, показывающее, как создать случайное число
источник
md5
что результатом будет ограничение в 30 символов и всегда строчные буквы.md5(rand())
предлагает только 2 ^ 32 возможных значений. Это означает, что в среднем после 2 ^ 16 случайных строк вы ожидаете, что одна из них повторится.В зависимости от вашего приложения (я хотел генерировать пароли), вы можете использовать
Будучи base64, они могут содержать
=
или-
также запрашиваемые символы. Вы можете сгенерировать более длинную строку, затем отфильтровать и обрезать ее, чтобы удалить их.openssl_random_pseudo_bytes
кажется рекомендуемым способом генерирования правильного случайного числа в php. Почемуrand
не пользуюсь/dev/random
я не знаю.источник
openssl_random_pseudo_bytes()
это портативный.Вот простая однострочная строка, которая генерирует истинную случайную строку без зацикливания на уровне сценария или использования библиотек OpenSSL.
Чтобы разбить его, чтобы параметры были понятны
Этот метод работает путем случайного повторения списка символов, затем перетасовывает объединенную строку и возвращает указанное количество символов.
Вы можете дополнительно рандомизировать это, рандомизируя длину возвращаемой строки, заменяя
$chrRandomLength
наmt_rand(8, 15)
(для случайной строки от 8 до 15 символов).источник
$chrRepeatMax
И$chrRepeatMin
), поэтому строка из 10 символов (маловероятно, но возможно) может быть «aaaaaaaaaa».Тада!
источник
sha1
что результатом будет ограничение в 40 символов и всегда строчные буквы.rant()
быть случайным не имеет значения, когда ша не распределен равномерно. Если вы случайным образом выбираете неравномерное распределение, вы получаете точно такое же неравномерное распределение. Я подчеркиваю не случайность "криптоуровня", если бы это было так, вы не должны использоватьrand()
также. Требуется минимальное усилие, чтобы извлечь из равномерного распределения, как в принятом ответе, и это так же случайно, как и rand (), что вполне разумно.Лучший способ реализовать эту функцию:
mt_rand
является более случайным в соответствии с этим и этим в PHP 7.rand
Функция является псевдонимомmt_rand
.источник
mt_rand
не генерирует криптографически безопасные значения. Для этого вы должны использовать PHP7random_int
илиrandom_bytes
.$randstring
в области действия функции не совпадает с областью, в которой вы ее вызываете. Вы должны присвоить возвращаемое значение переменной.Или просто повторить возвращаемое значение:
Также в вашей функции есть небольшая ошибка. В цикле for необходимо использовать
.=
каждый символ, добавляемый к строке. При использовании=
вы перезаписываете его с каждым новым символом вместо добавления.источник
Сначала вы определяете алфавит, который хотите использовать:
Затем используйте
openssl_random_pseudo_bytes()
для генерации правильных случайных данных:Наконец, вы используете эти случайные данные для создания пароля. Поскольку каждый символ в
$random
может бытьchr(0)
доchr(255)
, код использует остаток после деления своего порядкового значения,$alphabet_length
чтобы убедиться, что выбираются только символы из алфавита (обратите внимание, что это смещает случайность):В качестве альтернативы и, как правило, лучше использовать RandomLib и SecurityLib :
источник
%
приведет к смещенному выводу. Тем не менее, сильный +1 для RandomLib. Не изобретай велосипед.Короткие Методы ..
Вот кратчайший способ генерации случайной строки
источник
Там я проверил производительность большинства популярных функций, время, необходимое для генерации 1 000 000 строк из 32 символов на моем блоке:
Обратите внимание, что не важно, как долго это было на самом деле, но что медленнее и какое быстрее, так что вы можете выбирать в соответствии с вашими требованиями, включая готовность к криптографии и т. Д.
substr () вокруг MD5 был добавлен ради точности, если вам нужна строка длиной не более 32 символов.
Ради ответа: строка не была конкатенирована, но перезаписана и результат функции не был сохранен.
источник
PHP 7+ Создание криптографически безопасных случайных байтов с помощью функции random_bytes .
Возможный вывод
PHP 5.3+ Генерация псевдослучайных байтов с помощью функции openssl_random_pseudo_bytes .
Возможный вывод
Лучший вариант использования может быть
Возможный вывод
источник
Один очень быстрый способ - сделать что-то вроде:
Это сгенерирует случайную строку длиной 10 символов. Конечно, некоторые могут сказать, что это немного сложнее в вычислительной сфере, но в настоящее время процессоры оптимизированы для очень быстрого запуска алгоритмов md5 или sha256. И, конечно, если
rand()
функция возвращает одно и то же значение, результат будет таким же, с вероятностью 1/32767 того же самого. Если проблема в безопасности, просто изменитеrand()
наmt_rand()
источник
источник
Этот был взят из источников администратора :
Adminer , инструмент управления базами данных, написанный на PHP.
источник
Вспомогательная функция из рамок Laravel 5
источник
Источник от http://www.xeweb.net/2011/02/11/generate-a-random-string-az-0-9-in-php/
источник
Отредактированная версия функции работает нормально, но есть только одна проблема, которую я обнаружил: вы использовали неправильный символ для вложения $ символов, поэтому символ 'иногда является частью генерируемой случайной строки.
Чтобы это исправить, измените:
чтобы:
Таким образом, используются только вложенные символы, и символ 'никогда не будет частью генерируемой случайной строки.
источник
Еще один однострочник, который генерирует случайную строку из 10 символов с буквами и цифрами. Он создаст массив с
range
(отрегулируйте второй параметр, чтобы установить размер), зацикливается на этом массиве и назначает случайный символ ASCII (диапазон 0-9 или az), затем внедряет массив, чтобы получить строку.Примечание: это работает только в PHP 5.3 и позже
источник
rand(0, 57-48+122-97)<57-48?...:...
? :)Один лайнер.
Это быстро для огромных струн с некоторой уникальностью.
источник
md5(rand())
это ужасно небезопасный способ генерирования случайного числа.Начиная с php7, есть функции random_bytes. https://www.php.net/manual/ru/function.random-bytes.php, поэтому вы можете сгенерировать случайную строку, подобную этой
источник
Вот мое простое однострочное решение для генерации удобного случайного пароля, за исключением символов, которые похожи друг на друга, таких как «1» и «l», «O» и «0» и т. Д., Здесь 5 символов, но вы можете легко измените это конечно:
источник
Мне понравился последний комментарий, в котором использовался openssl_random_pseudo_bytes, но для меня это не было решением, так как мне все равно пришлось удалить ненужные символы, и я не смог получить строку заданной длины. Вот мое решение ...
источник
источник
Вот еще одно решение.
PS. Я использую PHP 7.2 на Ubuntu.
источник
Другой способ генерирования случайной строки в PHP :
источник
Вот как я делаю это, чтобы получить действительно уникальный случайный ключ:
Вы можете использовать time (), так как это временная метка Unix и всегда уникальна по сравнению с другими случайными числами, упомянутыми выше. Затем вы можете сгенерировать сумму md5 и взять необходимую длину из сгенерированной строки MD5 . В этом случае я использую 10 символов, и я мог бы использовать более длинную строку, если я хотел бы сделать ее более уникальной.
Надеюсь, это поможет.
источник
time()
он далеко не уникален: он будет возвращать одно и то же значение снова и снова, пока не закончится текущая секунда. Что действительно обеспечивает некоторую случайность, так это то, чтоstr_shuffle()
остальная часть кода только уменьшает выборку, из которой выбираются символы.time()
(это только временная метка), это слабый источник случайности.Параметризованный однострочник, использующий только нативные функции PHP , работающий с PHP 5.1.0
источник