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


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

  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(), что не подходит для криптографических целей (например, генерация случайных паролей). Вы хотите безопасный генератор случайных чисел!-Вместо -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.


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()));
?>

Я проверил производительность большинства популярных функций там, время, необходимое для генерации 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);