web-dev-qa-db-ja.com

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

この質問に具体的に答えると、2つの問題があります。 

  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() を使用します。これは暗号化の目的には不適切です(例:ランダムなパスワードの生成)。 安全な乱数発生器が欲しい 代わりに。文字を繰り返すこともできません。

もう一つの方法。

_更新_ (これにより任意の長さの文字列が生成されます):

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

デモ https://3v4l.org/b4PST (PHP 5の失敗は無視してください。これはrandom_compatが必要です)

273

20文字の16進数の文字列を作成します。

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

このメソッドは、文字リストをランダムに繰り返して結合した文字列をシャッフルし、指定した文字数を返します。

返される文字列の長さをランダム化し、$chrRandomLengthmt_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の thisthis に従ってランダムになります。 Rand関数はmt_Randのエイリアスです。

23
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  = '~!@#$%^&*(){}[],./?';
$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];
}

代わりに、そして一般的にもっと良いのは、 RandomLibSecurityLib を使うことです。

use SecurityLib\Strength;

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

$password = $generator->generateString(12, $alphabet);
14
Ja͢ck

私はそこで最もポピュラーな関数の性能をテストしました、私の箱の上に32個のシンボルの1000文字列を生成するのに必要な時間は以下の通りです:

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

それが実際にどれだけの期間であったかは重要ではありませんが、どれがより遅く、どれがより高速であるかに注意してください。

32シンボルより短い文字列が必要な場合、MD5の周りのsubstr()が正確さのために追加されました。

答えとして、文字列は連結されずに上書きされ、関数の結果は保存されませんでした。

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

これは 管理者のソースから取られました

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

管理者 、データベース管理ツールは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

非常に簡単な方法の1つは、次のようなことをすることです。

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

1行.
いくつかのユニークさを持つ巨大な文字列に対しては速い.

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

編集したバージョンの関数は問題なく動作します。1つだけ問題があります。$文字を囲むのに間違った文字を使用したため、 '文字が生成されるランダム文字列の一部になっている場合があります。

これを修正するには、次のように変更します。

$characters = ’0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;

に:

$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

この方法では囲まれた文字のみが使用され、 '文字は生成されるランダムな文字列の一部にはなりません。

4
bmcswee

もう一つのワンライナー。文字と数字で10文字のランダムな文字列を生成します。 range(サイズを設定するために2番目のパラメータを調整する)で配列を作成し、この配列をループしてランダムな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 _ にランダムな文字列を生成するもう1つの方法は、次のとおりです。

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

あなたが2つ以上のユニークな文字列を必要とするなら、あなたはこれをすることができます...

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

時間は常にタイムスタンプを返し、それは常にユニークです。あなたはそれを良くするためにmd5と一緒に使うことができます。 

次の関数は 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

文字ではなく数字に依存していて、ランダムな出力を単なる数字にしたいのかどうかわからないので、あなたはそれをまったく間違って行っています。関数を宣言する前に変数$randstringを初期化するのを忘れたにもかかわらず、なぜRand(0, 62)?を使用しないのですか。

とにかく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のタイムスタンプであり、上記の他の乱数と比較して常に一意であるため使用できます。その後、そのmd5sumを生成し、生成された 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_

1行の解決策は

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

これがワンライナーです。少なくとも1つの小文字、1つの大文字、1つの数字、および1つの記号が表示されます。暗号的に安全であるとされているrandom_intを使用します。私はこれが安全だとは主張していません。私はセキュリティの専門家ではありません。

コピー&ペーストするには: 

 for ($chars = array('0123456789','abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ','!@#$%^&*()_+-='),$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','!@#$%^&*()_+-='),
        $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