Генератор случайных строк 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; 

Что я делаю не так?

Чтобы конкретно ответить на этот вопрос, две проблемы:

  1. $randstring не входит в сферу действия, когда вы ее эхо.
  2. Символы не конкатенируются вместе в цикле.

Вот фрагмент кода с исправлениями:

 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); }