Генератор случайных строк 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;
что я делаю не так?
30 ответов
чтобы ответить на этот вопрос конкретно, две проблемы:
-
$randstring
не в области, когда вы эхо его. - символы не объединяются вместе в цикле.
вот фрагмент кода с исправлениями:
function generateRandomString($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
вывести случайную строку с вызовом ниже:
// Echo the random string.
// Optionally, you can give it a desired string length.
echo generateRandomString();
обратите внимание, что это создает предсказуемые случайные строки. Если вы хотите создать безопасную жетоны, посмотреть этот ответ.
Примечание:
str_shuffle()
внутренне используетrand()
, что не подходит для криптографических целей (например, генерация случайных паролей). Вы хотите безопасный генератор случайных чисел!-Вместо -6-->. Он также не позволяет персонажам повторяться.
еще один способ.
обновлено (теперь это генерирует любую длину строки):
function generateRandomString($length = 10) {
return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length);
}
echo generateRandomString(); // OR: generateRandomString(24)
вот и все. :)
на этот вопрос есть много ответов, но ни один из них не использует Криптографически Безопасный Генератор Псевдослучайных Чисел (CSPRNG).
простой, безопасный и правильный ответ-это использовать RandomLib и не изобретайте колесо.
для тех из вас, кто настаивает на изобретении собственного решения, PHP 7.0.0 предоставит random_int()
для этой цели; если вы все еще на PHP 5.х, мы написали PHP 5 polyfill для random_int()
таким образом, вы можете использовать новый API еще до обновления до PHP 7.
безопасное генерирование случайных целых чисел в PHP не тривиальная задача. Вы всегда должны проверять с ваши резидентные эксперты по криптографии StackExchange перед развертыванием домашнего алгоритма в производстве.
С безопасным целочисленным генератором на месте, генерация случайной строки с CSPRNG-это прогулка в парке.
создание безопасного, случайного Строка
/**
* Generate a random string, using a cryptographically secure
* pseudorandom number generator (random_int)
*
* For PHP 7, random_int is a PHP core function
* For PHP 5.x, depends on https://github.com/paragonie/random_compat
*
* @param int $length How many characters do we want?
* @param string $keyspace A string of all possible characters
* to select from
* @return string
*/
function random_str($length, $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
$pieces = [];
$max = mb_strlen($keyspace, '8bit') - 1;
for ($i = 0; $i < $length; ++$i) {
$pieces []= $keyspace[random_int(0, $max)];
}
return implode('', $pieces);
}
использование:
$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');
демо: https://3v4l.org/b4PST (игнорируйте ошибки PHP 5; ему нужен random_compat)
создает строку hexdec длиной 20 символов:
$string = bin2hex(openssl_random_pseudo_bytes(10)); // 20 chars
в PHP 7 (random_bytes()):
$string = base64_encode(random_bytes(10)); // ~14 chars
// or
$string = bin2hex(random_bytes(10)); // 20 chars
@tasmaniski: ваш ответ сработал для меня. У меня была та же проблема, и я бы предложил ее тем, кто всегда ищет тот же ответ. Вот оно от @tasmaniski:
<?php
$random = substr(md5(mt_rand()), 0, 7);
echo $random;
?>
в зависимости от вашего приложения (я хотел создать пароли), вы можете использовать
$string = base64_encode(openssl_random_pseudo_bytes(30));
будучи base64, они могут содержать =
или -
а также запрошенные символы. Вы можете создать более длинную строку, затем отфильтровать и обрезать ее, чтобы удалить их.
openssl_random_pseudo_bytes
кажется рекомендуемым способом создания правильного случайного числа в php. Почему?--4--> не использовать /dev/random
Я не знаю.
Я знаю, что это может быть немного поздно для игры, но вот простой однострочный, который генерирует истинную случайную строку без цикла уровня сценария или использования библиотек openssl.
echo substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', mt_rand(1,10))),1,10);
чтобы разбить его, чтобы параметры были ясны
// Character List to Pick from
$chrList = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
// Minimum/Maximum times to repeat character List to seed from
$chrRepeatMin = 1; // Minimum times to repeat the seed string
$chrRepeatMax = 10; // Maximum times to repeat the seed string
// Length of Random String returned
$chrRandomLength = 10;
// The ONE LINE random command with the above variables.
echo substr(str_shuffle(str_repeat($chrList, mt_rand($chrRepeatMin,$chrRepeatMax))),1,$chrRandomLength);
этот метод работает путем случайного повторения списка символов, затем перетасовывает объединенную строку и возвращает указанное количество символов.
далее можно случайно, по случайной длины возвращаемой строки, заменяя $chrRandomLength
С mt_rand(8, 15)
(для случайной строки от 8 до 15 символов).
лучший способ реализовать эту функцию:
function RandomString($length) {
$keys = array_merge(range(0,9), range('a', 'z'));
$key = "";
for($i=0; $i < $length; $i++) {
$key .= $keys[mt_rand(0, count($keys) - 1)];
}
return $key;
}
echo RandomString(20);
mt_rand
является более случайным в соответствии с этой и этой в php7. rand
функция является псевдонимом mt_rand
.
$randstring
в рамках функции не совпадает с областью, где вы это называете. Вы должны присвоить возвращаемое значение переменной.
$randstring = RandomString();
echo $randstring;
или просто непосредственно Эхо возвращаемое значение:
echo RandomString();
кроме того, в вашей функции у вас есть небольшая ошибка. В цикле for вам нужно использовать .=
таким образом, каждый символ добавляется к строке. Используя =
вы перезаписываете его с каждым новым символом вместо добавления.
$randstring .= $characters[rand(0, strlen($characters))];
во-первых, вы определяете алфавит, который хотите использовать:
$alphanum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$special = '~!@#$%^&*(){}[],./?';
$alphabet = $alphanum . $special;
затем используйте openssl_random_pseudo_bytes()
для генерации правильных случайных данных:
$len = 12; // length of password
$random = openssl_random_pseudo_bytes($len);
наконец, вы используете эти случайные данные для создания пароля. Потому что каждый символ в $random
может быть chr(0)
до chr(255)
код использует остаток от деления порядкового значения с $alphabet_length
чтобы убедиться, что выбраны только символы из алфавита (обратите внимание, что это смещает случайность):
$alphabet_length = strlen($alphabet);
$password = '';
for ($i = 0; $i < $len; ++$i) {
$password .= $alphabet[ord($random[$i]) % $alphabet_length];
}
альтернативно, и вообще лучше, использовать RandomLib и SecurityLib:
use SecurityLib\Strength;
$factory = new RandomLib\Factory;
$generator = $factory->getGenerator(new Strength(Strength::MEDIUM));
$password = $generator->generateString(12, $alphabet);
Короткие Методы..
вот некоторые кратчайший метод для генерации случайной строки
<?php
echo $my_rand_strng = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), -15);
echo substr(md5(rand()), 0, 7);
echo str_shuffle(MD5(microtime()));
?>
Я проверил производительность большинства популярных функций там, время, необходимое для генерации 1'000' 000 строк из 32 символов на моем поле:
2.5 $s = substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,32);
1.9 $s = base64_encode(openssl_random_pseudo_bytes(24));
1.68 $s = bin2hex(openssl_random_pseudo_bytes(16));
0.63 $s = base64_encode(random_bytes(24));
0.62 $s = bin2hex(random_bytes(16));
0.37 $s = substr(md5(rand()), 0, 32);
0.37 $s = substr(md5(mt_rand()), 0, 32);
обратите внимание, что не важно, как долго это было на самом деле, но который медленнее, а какой быстрее, поэтому вы можете выбрать в соответствии с вашими требованиями, включая криптографическую готовность и т. д.
substr () вокруг MD5 был добавлен ради точности, если вам нужна строка, которая короче 32 атрибутика.
для ответа: строка не была объединена, но перезаписана, и результат функции не был сохранен.
function rndStr($len = 64) {
$randomData = file_get_contents('/dev/urandom', false, null, 0, $len) . uniqid(mt_rand(), true);
$str = substr(str_replace(array('/','=','+'),'', base64_encode($randomData)),0,$len);
return $str;
}
этот был взят из источники проблемы:
/** Get a random string
* @return string 32 hexadecimal characters
*/
function rand_string() {
return md5(uniqid(mt_rand(), true));
}
проблемы инструмент управления базами данных, написанный на PHP.
один очень быстрый способ сделать что-то вроде:
substr(md5(rand()),0,10);
это создаст случайную строку длиной 10 символов. Конечно, некоторые могут сказать, что это немного тяжелее на вычислительной стороне, но в настоящее время процессоры оптимизированы для запуска алгоритма md5 или sha256 очень быстро. И конечно, если rand()
функция возвращает то же значение, результат будет таким же, имея 1 / 32767 шанс быть тем же. Если проблема в безопасности, просто измените rand()
to mt_rand()
вспомогательная функция от Laravel 5 framework
/**
* Generate a "random" alpha-numeric string.
*
* Should not be considered sufficient for cryptography, etc.
*
* @param int $length
* @return string
*/
function str_random($length = 16)
{
$pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
return substr(str_shuffle(str_repeat($pool, $length)), 0, $length);
}
отредактированная версия функции работает нормально, только одна проблема, которую я нашел: Вы использовали неправильный символ для вложения символов$, поэтому символ " иногда является частью случайной строки, которая генерируется.
чтобы исправить это, изменить:
$characters = ’0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;
в:
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
таким образом, используются только вложенные символы, и символ " никогда не будет частью случайной строки, которая генерируется.
еще один-лайнер, который генерирует случайную строку из 10 символов с буквами и цифрами. Он создаст массив с range
(отрегулируйте второй параметр, чтобы установить размер), петли над этим массивом и назначает случайный ascii-char (диапазон 0-9 или a-z), а затем взрывает массив, чтобы получить строку.
$str = implode('', array_map(function () { return chr(rand(0, 1) ? rand(48, 57) : rand(97, 122)); }, range(0, 9)));
Примечание: работает только в PHP 5.3+
одна линия.
быстро для огромных строк с некоторой уникальностью.
function random_string($length){
return substr(str_repeat(md5(rand()), ceil($length/32)), 0, $length);
}
/**
* @param int $length
* @param string $abc
* @return string
*/
function generateRandomString($length = 10, $abc = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
{
return substr(str_shuffle($abc), 0, $length);
}
источник http://www.xeweb.net/2011/02/11/generate-a-random-string-a-z-0-9-in-php/
Мне понравился последний комментарий, который использовал openssl_random_pseudo_bytes, но это не было решением для меня, поскольку мне все еще нужно было удалить символы, которые я не хотел, и я не смог получить строку set length. Вот мое решение...
function rndStr($len = 20) {
$rnd='';
for($i=0;$i<$len;$i++) {
do {
$byte = openssl_random_pseudo_bytes(1);
$asc = chr(base_convert(substr(bin2hex($byte),0,2),16,10));
} while(!ctype_alnum($asc));
$rnd .= $asc;
}
return $rnd;
}
function randomString($length = 5) {
return substr(str_shuffle(implode(array_merge(range('A','Z'), range('a','z'), range(0,9)))), 0, $length);
}
другой способ генерации случайной строки в PHP - это:
function RandomString($length) {
$original_string = array_merge(range(0,9), range('a','z'), range('A', 'Z'));
$original_string = implode("", $original_string);
return substr(str_shuffle($original_string), 0, $length);
}
echo RandomString(6);
есть простой код:
echo implode("",array_map(create_function('$s','return substr($s,mt_rand(0,strlen($s)),1);'),array_fill(0,16,"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")));
есть простое руководство:
- изменить длина строки, пожалуйста, измените
16
только для другого значения. - чтобы выбрать из разных символов, пожалуйста, измените строку символов.
есть лучшие альтернативы этому, многие уже были опубликованы, поэтому я даю вам только ваши вещи с исправлениями
<?php
function RandomString()
{
global $randstring ;
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randstring = '';
for ($i = 0; $i < 10; $i++) {
$randstring .= $characters[rand(0, strlen($characters))];
}
return $randstring;
}
RandomString();
echo $randstring;
?>
<?php
/**
* Creates a random string
*
* @param (int) $length
* Length in characters
* @param (array) $ranges
* (optional) Array of ranges to be used
*
* @return
* Random string
*/
function random_string($length, $ranges = array('0-9', 'a-z', 'A-Z')) {
foreach ($ranges as $r) $s .= implode(range(array_shift($r = explode('-', $r)), $r[1]));
while (strlen($s) < $length) $s .= $s;
return substr(str_shuffle($s), 0, $length);
}
// Examples:
$l = 100;
echo '<b>Default:</b> ' . random_string($l) . '<br />';
echo '<b>Lower Case only:</b> ' . random_string($l, array('a-z')) . '<br />';
echo '<b>HEX only:</b> ' . random_string($l, array('0-9', 'A-F')) . '<br />';
echo '<b>BIN only:</b> ' . random_string($l, array('0-1')) . '<br />';
/* End of file */
function getRandomString($length) {
$salt = array_merge(range('a', 'z'), range(0, 9));
$maxIndex = count($salt) - 1;
$result = '';
for ($i = 0; $i < $length; $i++) {
$index = mt_rand(0, $maxIndex);
$result .= $salt[$index];
}
return $result
}
вот как я это делаю, чтобы получить истинный уникальный случайный ключ:
$Length = 10;
$RandomString = substr(str_shuffle(md5(time())), 0, $Length);
echo $RandomString;
вы можете использовать time (), так как это временная метка Unix и всегда уникальна по сравнению с другими случайными, упомянутыми выше. Затем вы можете сгенерировать md5sum этого и взять необходимую длину из сгенерированного MD5 в строку. В этом случае я использую 10 символов, и я мог бы использовать более длинную строку, если бы хотел сделать ее более уникальной.
надеюсь, это поможет.
источник: PHP функция, которая генерирует случайные символы
эта функция PHP работала для меня:
function cvf_ps_generate_random_code($length=10) {
$string = '';
// You can define your own characters here.
$characters = "23456789ABCDEFHJKLMNPRTVWXYZabcdefghijklmnopqrstuvwxyz";
for ($p = 0; $p < $length; $p++) {
$string .= $characters[mt_rand(0, strlen($characters)-1)];
}
return $string;
}
использование:
echo cvf_ps_generate_random_code(5);