Генератор случайных строк 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.x, мы написали a 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)
создает 20-символьную длинную строку hexdec:
$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. Почемуrandне использовать/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.
$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 и безопасность:
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()tomt_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’;to:
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';таким образом, используются только вложенные символы, и символ ’ никогда не будет частью случайной строки, которая генерируется.
еще один-лайнер, который генерирует случайную строку из 10 символов с буквами и цифрами. Он создаст массив с
range(отрегулируйте второй параметр, чтобы установить размер), зацикливается на этом массиве и назначает случайный ascii-символ (диапазон 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, но это не было решением для меня, поскольку мне все еще нужно было удалить символы, которые я не хотел, и я не смог получить строку заданной длины. Вот мое решение...
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);
Comments