Я пытаюсь создать рандомизированную строку в PHP, и я не получаю абсолютно никакого вывода с этим:
<?php function RandomString() { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $randstring = ''; for ($i = 0; $i < 10; $i++) { $randstring = $characters[rand(0, strlen($characters))]; } return $randstring; } RandomString(); echo $randstring;
Что я делаю не так?
Чтобы конкретно ответить на этот вопрос, две проблемы:
$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()
, что непригодно для криптографических целей (например, генерирование случайных паролей). Вместо этого вы хотите создать защищенный генератор случайных чисел . Он также не позволяет повторять символы.
UPDATED (теперь это генерирует любую длину строки):
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, мы написали полисполнение PHP 5 для 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') { $str = ''; $max = mb_strlen($keyspace, '8bit') - 1; for ($i = 0; $i < $length; ++$i) { $str .= $keyspace[random_int(0, $max)]; } return $str; }
Использование :
$a = random_str(32); $b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');
Демо : https://3v4l.org/KKlc3 (Игнорируйте ошибки PHP 5, для этого требуется random_compat)
Создает строчную шестнадцатеричную строку длиной 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. Почему 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. Функция rand
является псевдонимом mt_rand
.
function generateRandomString($length = 15) { return substr(sha1(rand()), 0, $length); }
Тада!
$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())); ?>
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)); }
Adminer , инструмент управления базами данных, написанный на PHP.
Один очень быстрый способ – сделать что-то вроде:
substr(md5(rand()),0,10);
Это создаст случайную строку длиной 10 символов. Конечно, некоторые могут сказать, что это немного тяжелее на вычислительной стороне, но в наши дни процессоры оптимизированы для быстрого запуска алгоритма md5 или sha256. И, конечно, если функция rand()
возвращает одно и то же значение, результат будет таким же, имея 1/32767 шанс быть тем же. Если проблема безопасности, то просто измените rand()
на mt_rand()
Редактированная версия функции работает нормально, только одна проблема, которую я нашел: вы использовали неправильный символ для вложения $ символов, поэтому символ иногда является частью генерируемой случайной строки.
Чтобы исправить это, измените:
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
чтобы:
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
Таким образом, используются только замкнутые символы, и символ никогда не будет частью генерируемой случайной строки.
Другой однострочный, который генерирует случайную строку из 10 символов с буквами и цифрами. Он создаст массив с range
(отрегулируйте второй параметр для установки размера), переместится через этот массив и назначит случайный ascii-char (диапазон 0-9 или az), а затем размоет массив, чтобы получить строку.
$str = implode('', array_map(function () { return chr(rand(0, 1) ? rand(48, 57) : rand(97, 122)); }, range(0, 9)));
Примечание: работает только в PHP 5.3+
Вспомогательная функция из системы Laravel 5
/** * 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); }
одна линия.
быстро для огромных струн с некоторой уникальностью.
function random_string($length){ return substr(str_repeat(md5(rand()), ceil($length/32)), 0, $length); }
Мне понравился последний комментарий, который использовал 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; }
Существует простой код:
echo implode("",array_map(create_function('$s','return substr($s,mt_rand(0,strlen($s)),1);'),array_fill(0,16,"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")));
Существует простое руководство:
16
на другое. 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);
наконец, я нашел решение получить случайное и уникальное значение, которое мое решение
substr(md5(time()), 0, 12)
время всегда возвращает timstamp и всегда уникально. вы можете использовать его с md5, чтобы сделать его лучше.
function randomString() { return md5(rand(100, 200)); }
<?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);
Следующая функция генерирует псевдо string любой длины.
/** * Returns random string of a given length. */ function get_random_string($length) { $pull = []; while (count($pull) < $length) { $pull = array_merge($pull, range(0, 9), range('a', 'z'), range('A', 'Z')); } shuffle($pull); return substr(implode($pull), 0, $length); }