Penggunaan fungsi USERLAND pada PHP

Saya mencoba membuat string acak dalam PHP, dan saya sama sekali tidak mendapatkan output dengan ini:

<?php
function RandomString()
{
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randstring = '';
    for ($i = 0; $i < 10; $i++) {
        $randstring = $characters[Rand(0, strlen($characters))];
    }
    return $randstring;
}
RandomString();
echo $randstring;

Apa yang saya lakukan salah?

Untuk menjawab pertanyaan ini secara khusus, dua masalah: 

  1. $randstring tidak ada dalam ruang lingkup saat Anda menggemakannya.
  2. Karakter tidak disatukan dalam satu lingkaran.

Berikut cuplikan kode dengan koreksi:

function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[Rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

Keluarkan string acak dengan panggilan di bawah ini:

// Echo the random string.
// Optionally, you can give it a desired string length.
echo generateRandomString();

Harap dicatat bahwa ini menghasilkan string acak yang dapat diprediksi. Jika Anda ingin membuat token aman, lihat jawaban ini .

Ada banyak jawaban untuk pertanyaan ini, tetapi tidak ada satupun dari mereka yang memanfaatkan Generator Pseudo-Random Cryptographically Secure (CSPRNG).

Jawaban sederhana, aman, dan benar adalah dengan menggunakan RandomLib dan jangan menemukan kembali kemudi.

Bagi Anda yang bersikeras menciptakan solusi Anda sendiri, PHP 7.0.0 akan memberikan random_int() untuk tujuan ini; jika Anda masih menggunakan PHP 5.x, kami menulis PHP 5 polyfill untuk random_int() sehingga Anda dapat menggunakan API baru bahkan sebelum Anda meningkatkan ke PHP 7.

Menghasilkan bilangan bulat acak dengan aman di PHP bukan tugas sepele. Anda harus selalu memeriksa dengan pakar kriptografi StackExchange Anda sebelum Anda menggunakan algoritme buatan sendiri dalam produksi.

Dengan generator integer yang aman, menghasilkan string acak dengan CSPRNG adalah jalan-jalan di taman.

Membuat String yang Aman dan Acak

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

Penggunaan:

$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');

Demo: https://3v4l.org/b4PST (Abaikan PHP 5 kegagalan; perlu random_compat)

Membuat string hexdec 20 char panjang:

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

Dalam 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

@tasmaniski: jawaban Anda berhasil untuk saya. Saya memiliki masalah yang sama, dan saya akan menyarankannya untuk mereka yang pernah mencari jawaban yang sama. Ini dia dari @tasmaniski:

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

Bergantung pada aplikasi Anda (saya ingin menghasilkan kata sandi), Anda dapat menggunakannya

$string = base64_encode(openssl_random_pseudo_bytes(30));

Menjadi base64, mereka dapat berisi = atau - serta karakter yang diminta. Anda bisa menghasilkan string yang lebih panjang, lalu filter dan potong untuk menghilangkannya.

openssl_random_pseudo_bytes tampaknya menjadi cara yang disarankan untuk menghasilkan angka acak yang tepat di php. Mengapa Rand tidak menggunakan /dev/random Saya tidak tahu.

Saya tahu ini mungkin agak terlambat untuk permainan, tetapi di sini adalah satu-liner sederhana yang menghasilkan string acak yang benar tanpa perulangan tingkat script atau penggunaan perpustakaan openssl.

echo substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', mt_Rand(1,10))),1,10);

Untuk memecahnya sehingga parameternya jelas

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

Metode ini bekerja dengan mengulangi daftar karakter secara acak, lalu mengocok string gabungan, dan mengembalikan jumlah karakter yang ditentukan.

Anda selanjutnya dapat mengacak ini, dengan mengacak panjang string yang dikembalikan, mengganti $chrRandomLength dengan mt_Rand(8, 15) (untuk string acak antara 8 dan 15 karakter).

Cara yang lebih baik untuk mengimplementasikan fungsi ini adalah:

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 lebih acak menurut this dan this di php7. Fungsi Rand adalah alias dari mt_Rand.

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

Tada!

$randstring dalam lingkup fungsi tidak sama dengan ruang lingkup tempat Anda memanggilnya. Anda harus menetapkan nilai kembali ke variabel.

$randstring = RandomString();
echo $randstring;

Atau langsung gandakan nilai kembali:

echo RandomString();

Juga, dalam fungsi Anda, Anda memiliki sedikit kesalahan. Di dalam for loop, Anda perlu menggunakan .= sehingga setiap karakter ditambahkan ke string. Dengan menggunakan = Anda menimpa dengan setiap karakter baru alih-alih menambahkan.

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

Pertama, Anda mendefinisikan alfabet yang ingin Anda gunakan:

$alphanum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$special  = '[email protected]#$%^&*(){}[],./?';
$alphabet = $alphanum . $special;

Kemudian, gunakan openssl_random_pseudo_bytes() untuk menghasilkan data acak yang tepat:

$len = 12; // length of password
$random = openssl_random_pseudo_bytes($len);

Akhirnya, Anda menggunakan data acak ini untuk membuat kata sandi. Karena setiap karakter dalam $random dapat berupa chr(0) hingga chr(255), kode tersebut menggunakan sisanya setelah pembagian nilai ordinalnya dengan $alphabet_length untuk memastikan hanya karakter dari alfabet yang dipilih (perhatikan bahwa hal itu bias bias keacakan):

$alphabet_length = strlen($alphabet);
$password = '';
for ($i = 0; $i < $len; ++$i) {
    $password .= $alphabet[ord($random[$i]) % $alphabet_length];
}

Atau, dan umumnya lebih baik, adalah menggunakan RandomLib dan SecurityLib :

use SecurityLib\Strength;

$factory = new RandomLib\Factory;
$generator = $factory->getGenerator(new Strength(Strength::MEDIUM));

$password = $generator->generateString(12, $alphabet);

Saya telah menguji kinerja fungsi paling populer di sana, waktu yang diperlukan untuk menghasilkan 1'000'000 string 32 simbol pada kotak saya adalah:

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

Harap dicatat, tidak penting berapa lama itu sebenarnya tetapi mana yang lebih lambat dan mana yang lebih cepat sehingga Anda dapat memilih sesuai dengan kebutuhan Anda termasuk kesiapan kriptografi, dll.

substr () sekitar MD5 ditambahkan demi akurasi jika Anda memerlukan string yang lebih pendek dari 32 simbol.

Demi jawaban: string tidak disatukan tetapi ditimpa dan hasil fungsi tidak disimpan.

Metode Pendek ..

Berikut adalah beberapa metode terpendek untuk menghasilkan string acak

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

Yang ini diambil dari sumber admin :

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

Adminer , alat manajemen basis data yang ditulis dalam PHP.

Fungsi pembantu dari kerangka 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);
}

Salah satu cara yang sangat cepat adalah melakukan sesuatu seperti:

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

Ini akan menghasilkan string acak dengan panjang 10 karakter. Tentu saja, beberapa orang mungkin mengatakan itu sedikit lebih berat di sisi komputasi, tetapi saat ini prosesor dioptimalkan untuk menjalankan algoritma md5 atau sha256 dengan sangat cepat. Dan tentu saja, jika fungsi Rand() mengembalikan nilai yang sama, hasilnya akan sama, memiliki peluang 1/32767 untuk menjadi sama. Jika keamanan adalah masalah, maka ubah saja Rand() menjadi mt_Rand() 

satu baris.
cepat untuk string besar dengan beberapa keunikan.

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

Versi fungsi yang diedit berfungsi dengan baik, hanya satu masalah yang saya temukan: Anda menggunakan karakter yang salah untuk menyertakan $ karakter, sehingga karakter sometimes terkadang merupakan bagian dari string acak yang dihasilkan.

Untuk memperbaiki ini, ubah:

$characters = ’0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;

untuk:

$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

Dengan cara ini hanya karakter terlampir yang digunakan, dan karakter ’tidak akan pernah menjadi bagian dari string acak yang dihasilkan.

Satu kalimat lagi, yang menghasilkan string acak 10 karakter dengan huruf dan angka. Ini akan membuat array dengan range (sesuaikan parameter kedua untuk mengatur ukuran), loop atas array ini dan menetapkan ascii-char acak (rentang 0-9 atau a-z), kemudian memasukkan array untuk mendapatkan string.

$str = implode('', array_map(function () { return chr(Rand(0, 1) ? Rand(48, 57) : Rand(97, 122)); }, range(0, 9)));

Catatan: hanya berfungsi di PHP 5.3+

Saya menyukai komentar terakhir yang menggunakan openssl_random_pseudo_bytes, tetapi itu bukan solusi bagi saya karena saya masih harus menghapus karakter yang tidak saya inginkan, dan saya tidak bisa mendapatkan string set panjang. Inilah solusi saya ...

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

Cara lain untuk menghasilkan string acak di PHP adalah:

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

Ada kode sederhana:

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

Ada panduan sederhana:

  • Untuk mengubah panjang string , ubah 16 menjadi nilai lain, hanya.
  • Untuk memilih dari karakter yang berbeda, silakan ubah string karakter.

ada alternatif yang lebih baik untuk ini, banyak sudah diposting jadi saya hanya memberikan barang Anda kembali dengan perbaikan

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

juga Anda mungkin tertarik pada:

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

    ?>

atau yang lain:

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

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

Saya tahu bahwa ini adalah pertanyaan lama dengan beberapa jawaban tetapi saya dapat mencoba memposting solusi saya ... gunakan fungsi ini untuk menghasilkan string alfanumerik acak khusus ...

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

Contoh (tes): Y1FypdjVbFCFK6Gh9FDJpe6dciwJEfV6MQGpJqAfuijaYSZ86

jika Anda membutuhkan dua atau lebih string unik Anda dapat melakukan ini ...

  $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

Saya harap ini membantu.

Sumber: PHP Fungsi yang Menghasilkan Karakter Acak

Fungsi PHP ini berfungsi untuk saya:

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;

}

Pemakaian: 

echo cvf_ps_generate_random_code(5);

Kelas dengan beberapa fungsi dari diskusi di atas.

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

akhirnya saya menemukan solusi untuk mendapatkan nilai acak dan unik .__ solusi saya adalah 

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

waktu selalu mengembalikan timstamp dan selalu unik. Anda dapat menggunakannya dengan md5 untuk membuatnya lebih baik. 

Fungsi berikut menghasilkan string pseudo dari 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);
}
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
}

Anda melakukannya dengan benar-benar salah karena Anda bergantung pada angka bukan karakter dan saya tidak yakin apakah Anda ingin output acak menjadi angka saja, jika demikian mengapa kebutuhan untuk mendapatkan semua huruf alfabet dan semua angka dan mengekstrak panjangnya? mengapa Anda tidak menggunakan Rand(0, 62) ?, meskipun Anda lupa menginisialisasi variabel $randstring Anda sebelum Anda mendeklarasikan fungsinya.

anyways PHP menawarkan Anda fungsi yang sangat berguna untuk keperluan ini str_shuffle(), Ini adalah contoh yang sesuai dengan kebutuhan Anda.

<?php

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

Inilah cara saya melakukannya untuk mendapatkan kunci acak unik unik:

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

Anda dapat menggunakan waktu () karena ini adalah cap waktu Unix dan selalu unik dibandingkan dengan acak lainnya yang disebutkan di atas. Anda kemudian dapat menghasilkan md5sum itu dan mengambil panjang yang diinginkan dari string MD5 yang dihasilkan. Dalam hal ini saya menggunakan 10 karakter, dan saya bisa menggunakan string yang lebih panjang jika saya ingin membuatnya lebih unik.

Saya harap ini membantu.

function randomString() {
       return md5(Rand(100, 200));
}
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;
}

Sederhana dan elegan.

Solusi satu baris akan menjadi

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

Ini satu kalimat. Anda akan mendapatkan setidaknya satu huruf kecil, satu huruf besar, satu angka, dan satu simbol. Menggunakan random_int yang seharusnya aman secara cyptographic. Saya tidak mengklaim ini aman. Saya bukan ahli keamanan.

Untuk menyalin + menempel: 

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

Dan sedikit lebih rusak:

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

Saya menggunakan $chars[$i%4] di loop untuk memilih set karakter yang akan diacak. Ini menjamin banyak karakter dari setiap rangkaian karakter dalam array.

Ini pasti dapat ditingkatkan (mengacak berapa banyak masing-masing karakter yang ada), tetapi cukup baik untuk tujuan saya.

Ada 3 hal yang salah dengan kode Anda:

  1. $ randstring tidak ditugaskan untuk apa pun (hanya di dalam fungsi yang di luar ruang lingkup).
  2. RandomString hanya mengembalikan karakter acak terakhir. Ganti = dengan .=.
  3. Rand tidak menghasilkan nomor pseudo-acak yang aman secara kriptografis. Gunakan random_int sebagai gantinya.

Lihat di bawah:

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

halo kamu bisa coba ini

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



?>

anda juga dapat menggunakan md5 tepat waktu tetapi hati-hati. Anda harus menggunakan fungsi microtime() dan bukan time() karena jika beberapa utas berjalan dalam detik yang sama, Anda perlu mendapatkan string berbeda untuk semuanya.

<?php

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

?>

Dalam metode ini, Anda dapat memilih panjang karakter saat membuat.

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