it-swarm.com.ru

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;

Что я делаю неправильно?

704
Captain Lightning

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

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

Обратите внимание, что это генерирует предсказуемые случайные строки. Если вы хотите создать безопасные токены, см. Этот ответ .

1240
Stephen Watkins

Примечание: 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)

Вот и все. :) 

338
Pr07o7yp3

Есть много ответов на этот вопрос, но ни один из них не использует криптографически безопасный генератор псевдослучайных чисел (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')
{
    $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');

Demo: https://3v4l.org/b4PST (игнорировать PHP 5 сбоев; требуется случайный_компат)

273
Scott Arciszewski

Создает строку hexdec длиной 20 символов:

$string = bin2hex(openssl_random_pseudo_bytes(10)); // 20 chars

В PHP 7 ( random_bytes () ):

$string = base64_encode(random_bytes(10)); // ~14 chars, includes /=+
// or
$string = substr(str_replace(['+', '/', '='], '', base64_encode(random_bytes(32))), 0, 32); // 32 chars, without /=+
// or
$string = bin2hex(random_bytes(10)); // 20 chars, only 0-9a-f
119
Rudie

@tasmaniski: ваш ответ сработал для меня. У меня была такая же проблема, и я бы предложил ее тем, кто когда-либо ищет один и тот же ответ. Вот это от @tasmaniski:

<?php 
    $random = substr(md5(mt_Rand()), 0, 7);
    echo $random;
?>
81
Humphrey

В зависимости от вашего приложения (я хотел генерировать пароли), вы можете использовать

$string = base64_encode(openssl_random_pseudo_bytes(30));

Будучи base64, они могут содержать = или -, а также запрошенные символы. Вы можете создать более длинную строку, затем отфильтровать и обрезать ее, чтобы удалить их.

openssl_random_pseudo_bytes кажется рекомендуемым способом генерирования правильного случайного числа в php. Почему Rand не использует /dev/random Я не знаю.

43
rjmunro

Я знаю, что это может быть немного поздно для игры, но вот простая однострочная строка, которая генерирует истинную случайную строку без какого-либо зацикливания на уровне скрипта или использования библиотек 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 символов).

25
Kraang Prime

Лучший способ реализовать эту функцию:

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.

23
Rathienth Baskaran
function generateRandomString($length = 15)
{
    return substr(sha1(Rand()), 0, $length);
}

Тада!

23
Davor

$randstring в области действия функции не совпадает с областью, в которой вы ее вызываете. Вы должны присвоить возвращаемое значение переменной.

$randstring = RandomString();
echo $randstring;

Или просто повторить возвращаемое значение:

echo RandomString();

Также в вашей функции есть небольшая ошибка. В цикле for вам нужно использовать .=, чтобы каждый символ добавлялся к строке. Используя =, вы перезаписываете его каждым новым символом вместо добавления.

$randstring .= $characters[Rand(0, strlen($characters))];
19
BoltClock

Сначала вы определяете алфавит, который хотите использовать:

$alphanum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$special  = '[email protected]#$%^&*(){}[],./?';
$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);
14
Ja͢ck

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

Ради ответа: строка не была конкатенирована, но перезаписана, и результат функции не был сохранен.

9
Putnik

Короткие Методы ..

Вот кратчайший способ генерации случайной строки

<?php
echo $my_Rand_strng = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), -15); 

echo substr(md5(Rand()), 0, 7);

echo str_shuffle(MD5(microtime()));
?>
9
Punit Gajjar
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;
}
7
Руслан Ибрагимов

Этот был взят из источников администратора :

/** Get a random string
* @return string 32 hexadecimal characters
*/
function Rand_string() {
    return md5(uniqid(mt_Rand(), true));
}

Adminer , инструмент управления базами данных, написанный на PHP.

7
userlond

Вспомогательная функция из рамок 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);
}
6
artnikpro

Один очень быстрый способ - сделать что-то вроде:

substr(md5(Rand()),0,10);

Это сгенерирует случайную строку длиной 10 символов. Конечно, некоторые могут сказать, что это немного сложнее в вычислительной сфере, но в настоящее время процессоры оптимизированы для очень быстрого запуска алгоритмов md5 или sha256. И, конечно, если функция Rand() возвращает одно и то же значение, результат будет таким же, с вероятностью 1/32767 того же. Если проблема в безопасности, просто измените Rand() на mt_Rand() 

6
Akatosh
/**
 * @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/

4
sxn

одна линия.
быстро для огромных струн с некоторой уникальностью.

function random_string($length){
    return substr(str_repeat(md5(Rand()), ceil($length/32)), 0, $length);
}
4
Jacob Smith

Отредактированная версия функции работает нормально, только одна проблема, которую я обнаружил: вы использовали неправильный символ для вложения $ символов, поэтому символ 'иногда является частью генерируемой случайной строки.

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

$characters = ’0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;

чтобы:

$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

Таким образом используются только вложенные символы, и символ ’никогда не будет частью генерируемой случайной строки.

4
bmcswee

Еще один однострочник, который генерирует случайную строку из 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+

4
kasimir

Мне понравился последний комментарий, в котором использовался 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;
}
3
RKaneKnight
function randomString($length = 5) {
       return substr(str_shuffle(implode(array_merge(range('A','Z'), range('a','z'), range(0,9)))), 0, $length);
}
3
Anjith K P

Другой способ создать случайную строку в 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);
2
Akhilraj N S

Есть простой код:

echo implode("",array_map(create_function('$s','return substr($s,mt_Rand(0,strlen($s)),1);'),array_fill(0,16,"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")));

Есть простое руководство:

  • Чтобы изменить длину строки , измените 16 только на другое значение.
  • Чтобы выбрать из разных символов, пожалуйста, измените строку символов.
2
16ctt1x

есть лучшие альтернативы этому, многие уже были опубликованы, поэтому я возвращаю вам только ваши вещи с исправлениями

<?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 


    function RandomString()
    {
        global $randstring ;
        $characters = str_split('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
        array_filter ($characters,function($var)use($characters,&$randstring){
                $randstring .= $characters[Rand(0, count($characters)-1)];
        });
        return $randstring;
    }

    RandomString();echo $randstring.'<hr>';

    //.. OR  ..
    $randstring='';echo(RandomString());

    ?>

или еще один:

<?php

function s($length){
  for($i=0;($i<$length)and(($what=Rand(1,3))and( (($what==1)and($t=Rand(48,57) ))or (($what==2)and ($t=Rand(65,90))) or (($what==3)and ($t=Rand(97,122)))  ) and  (print chr($t)));$i++);
}
s(10);

?>
2
Constantin
<?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 */
1
Geo

Параметризованный однострочник, использующий только PHP собственные функции , работающий с PHP 5.1.0

str_shuffle(implode('', (array_intersect_key(($map =  array_map('chr', array_merge(array_map('mt_Rand', array_fill(0, $length = 25, 48), array_fill(0,$length,57)),array_map('mt_Rand', array_fill(0, $length, 65), array_fill(0,$length,90)),array_map('mt_Rand', array_fill(0, $length, 97), array_fill(0,$length,122))))), array_flip($keys = array_Rand($map, $length))))))
1
user10099

Я знаю, что это старый вопрос с несколькими ответами, но я могу попытаться опубликовать свое решение ... используйте эту функцию для генерации произвольной случайной буквенно-цифровой строки ...

<?php
  function random_alphanumeric($length) {
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12345689';
    $my_string = '';
    for ($i = 0; $i < $length; $i++) {
      $pos = mt_Rand(0, strlen($chars) -1);
      $my_string .= substr($chars, $pos, 1);
    }
    return $my_string;
  }
  $test = random_alphanumeric(50); // 50 characters
  echo $test;
?>

Пример (тест): Y1FypdjVbFCFK6Gh9FDJpe6dciwJEfV6MQGpJqAfuijaYSZ86

если вам нужны две или более уникальные строки, вы можете сделать это ...

  $string_1 = random_alphanumeric(50);
  $string_2 = random_alphanumeric(50);
  while ($string_1 == $string_2) {
    $string_1 = random_alphanumeric(50);
    $string_2 = random_alphanumeric(50);
    if ($string_1 != $string_2) {
       break;
    }
  }
  echo $string_1;
  echo "<br>\n";
  echo $string_2;

$ string_1: KkvUwia8rbDEV2aChWqm3AgeUZqyrRbUx2AxVhx5s4TSJ2VwA4

$ string_2: XraO85YfxBBCInafvwipSOJwLmk6JMWiuWOxYQDnXohcn2D8K6

Я надеюсь, что это поможет.

1
Alessandro

Источник: 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);
1
Carl

Класс с некоторыми функциями из обсуждений выше.

$options['numeric'] = true;
$options['uppercase'] = true;
$options['lowercase'] = true;
$new = new RandomString($options);




class RandomString
{
    /**
     * @var array
     */
    private $default = ['numeric' => true, 'uppercase' => true, 'lowercase' => true];

    /**
     * @var array
     */
    private $options;

    /**
     * array
     */
    private $whitelist = ['numeric', 'uppercase', 'lowercase'];

    /**
     * RandomString constructor.
     *
     * @param array $options
     */
    public function __construct(array $options = [])
    {
        $this->options = $this->default;
        if(!empty($options))
        {
            $options = array_intersect_key($options, array_flip($this->whitelist));
            if(empty($options))
            {
                $this->options = $this->default;
            }else
            {
                $this->options = $options;
            }
        }

    }

    /**
     * @return string
     */
    private function returnCharacters(){

        $options = $this->options;

        $numbers = '0123456789';
        $uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $lowercase = "abcdefghijklmnopqrstuvwxyz";

        $characters = '';
        if(isset($options['numeric']) && $options['numeric'] === true){
            $characters .= $numbers;
        }

        if(isset($options['uppercase']) && $options['uppercase'] === true){
            $characters .= $uppercase;
        }

        if(isset($options['lowercase']) && $options['lowercase'] === true){
            $characters .= $lowercase;
        }
        return $characters;

    }

    /**
     * @param $length
     * @param $quantity
     * @return string
     */
    public function randomString($length, $quantity) {

        $string = '';
        $characters = $this->returnCharacters();

        for ($j = 0; $j < $quantity; $j++) {
            for($i = 0; $i < $length; $i++){
                $string .= $characters[mt_Rand(0, strlen($characters) - 1)];
            }
            $string .= "\n";
        }
        return $string;
    }

    /**
     * @return array
     */
    public function getOptions()
    {
        return $this->options;
    }

    /**
     * @return mixed
     */
    public function getWhitelist()
    {
        return $this->whitelist;
    }
1
dixromos98

наконец, я нашел решение, чтобы получить случайное и уникальное значение мое решение 

substr(md5(time()), 0, 12)

время всегда возвращают timstamp и оно всегда уникально. Вы можете использовать его с MD5, чтобы сделать его лучше. 

1
Muhammad Junaid Aslam

Следующая функция генерирует псевдостроку из any length. 

/**
 * 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);
}
1
ya.teck
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
}
1
Ryan Williams

Вы делаете это совершенно неправильно, потому что вы зависите от цифр, а не от символов, и я не уверен, хотите ли вы, чтобы случайный вывод был просто цифрами, если да, то почему нужно получать все буквы алфавита и все цифры и извлекать их длину? почему бы вам просто не использовать Rand(0, 62)?, даже если вы забыли инициализировать свою переменную $randstring перед тем, как объявить функцию.

anyways PHP предлагает вам очень удобную функцию для этой цели, это str_shuffle(), вот пример, который соответствует вашим потребностям.

<?php

function randomString() {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    return str_shuffle($characters);
}
echo randomString();

1
Wael Assaf

Вот как я делаю это, чтобы получить действительно уникальный случайный ключ:

$Length = 10;
$RandomString = substr(str_shuffle(md5(time())), 0, $Length);
echo $RandomString;

Вы можете использовать time (), так как это метка времени Unix и всегда уникальна по сравнению с другими случайными числами, упомянутыми выше. Затем вы можете сгенерировать сумму md5 и взять нужную вам длину из сгенерированной строки MD5 . В этом случае я использую 10 символов, и я мог бы использовать более длинную строку, если я хотел бы сделать ее более уникальной.

Надеюсь, это поможет.

1
sherpa
function randomString() {
       return md5(Rand(100, 200));
}
0
user2372197
function strgen($len) {
    $buf = '';
    for ($i = 0; $i < $len; $i++) {
        $j = mt_Rand(0, 61);
        if ($j >= 36) {
            $j += 13;
        } else if ($j >= 10) {
            $j += 7;
        }
        $buf .= chr(48 + $j);
    }
    return $buf;
}

Просто и элегантно.

0
ch1p_

Однострочное решение будет

str_shuffle(base64_encode(date('mdyhis').date('mdyhis')));
0
mujaffars

Вот один вкладыш. Вы получите как минимум одну строчную букву, одну заглавную букву, одно число и один символ. Использует random_int, который должен быть защищен киртографически. Я не утверждаю, что это безопасно. Я не эксперт по безопасности.

Чтобы скопировать + вставить: 

 for ($chars = array('0123456789','abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ','[email protected]#$%^&*()_+-='),$randomString="",$i=0;$i<12;$i++)$randomString .= substr($chars[$i%4], random_int(0,strlen($chars[$i%4])), 1);

И еще немного разбитый

for (
        $chars = array('0123456789','abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ','[email protected]#$%^&*()_+-='),
        $randomString="",
        $i=0;
        $i<12;$i++)
        $randomString .= 
            substr($chars[$i%4], 
                random_int(0, strlen($chars[$i%4])), 1);

Я использую $chars[$i%4] в цикле, чтобы выбрать набор символов для случайного выбора. Это гарантирует несколько символов из каждого набора символов в массиве.

Это, безусловно, может быть улучшено (случайное количество каждого набора символов), но этого достаточно для моих целей.

0
Reed

В вашем коде есть 3 ошибки:

  1. $ randstring не назначен ни для чего (только внутри функции, которая находится вне области видимости).
  2. RandomString возвращает только последний случайный символ. Замените = на .=.
  3. Rand не генерирует криптографически безопасные псевдослучайные числа. Вместо этого используйте random_int.

Увидеть ниже:

<?php
    function RandomString()
    {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $randstring = '';
        for ($i = 0; $i < 10; $i++) {
            $randstring .= $characters[random_int(0, strlen($characters))];
        }
        return $randstring;
    }
    $randstring = RandomString();
    echo $randstring;
0
Dan Bray
function randomName($length = 8) {
  $values = array_merge(range(65, 90), range(97, 122), range(48, 57));
  $max = count($values) - 1;
  $str = chr(mt_Rand(97, 122));
  for ($i = 1; $i < $length; $i++) {
    $str .= chr($values[mt_Rand(0, $max)]);
  }
  return $str;
}
0
mrded

привет ты можешь попробовать это

<?php


function random($len){

    $char = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    // ----------------------------------------------
    // number of possible combinations
    // ----------------------------------------------
    $pos = strlen($char);
    $pos = pow($pos, $len);
    echo $pos.'<br>';
    // ----------------------------------------------

    $total = strlen($char)-1;
    $text = "";

    for ($i=0; $i<$len; $i++){
        $text = $text.$char[Rand(0, $total)];
    }

    return $text;

}


$string = random(15);
echo $string;



?>

вы также можете использовать md5 вовремя, но будьте осторожны вам нужно использовать функцию microtime(), а не функцию time(), потому что если несколько потоков выполняются в течение одной секунды, вам нужно получить разные строки для всех из них.

<?php

    $string = md5( microtime() );
    echo $string;

?>
0
Aominé

В этом методе вы можете выбрать длину символа при создании.

<?php
$random_string="";
$character_count=12;
for($i=1; $i<=$character_count; $i++)
{
$random_string.=chr(Rand(97,122));
}
echo $random_string;
?>
0
Nishanth Prabu