web-dev-qa-db-ja.com

1行PHP=ランダム文字列ジェネレーター?

ランダム/ユニークな文字列を生成する最短の方法を探しています。そのために、次の2つを使用していました。

$cClass = sha1(time());

または

$cClass = md5(time());

ただし、文字列はアルファベット文字で始まる必要があります。base64エンコーディングを探していましたが、==最後に、それを取り除く必要があります。

1行のコードでこれを達成する最良の方法は何でしょうか?


更新:

PRNDLは、私がそれを使用することになったが、少し修正された良い提案を思いつきました

echo substr(str_shuffle(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ),0, 1) . substr(str_shuffle(aBcEeFgHiJkLmNoPqRstUvWxYz0123456789),0, 31)

Md5ハッシュを模倣する32文字を生成しますが、最初の文字とアルファベット文字を常に生成します。

solution 1

しかし、oursは本当に改善され、彼の答えは;

substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1).substr(md5(time()),1);

短くて甘い

Anonymous2011による他の提案は非常に素晴らしかったが、何らかの理由で最初のキャラクターは常にM、N、Y、Zのいずれかでしたので、私の目的に合わなかったが、選ばれた答えだったでしょう。それは常にそれらの特定の文字をもたらすだろうか?

これが私の修正版のプレビューです

echo  rtrim(base64_encode(md5(microtime())),"=");

runner up

38
David Garcia

アルファベット文字列をシャッフルするよりも、単一のランダムな文字を取得する方が迅速です。

文字列から単一のランダムな文字を取得し、md5( time( ) )を追加します。 md5( time( ) )を追加する前に、結果の文字列の長さを32文字に保つために、1文字を削除します。

substr("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", mt_Rand(0, 51), 1).substr(md5(time()), 1);

小文字バージョン:

substr("abcdefghijklmnopqrstuvwxyz", mt_Rand(0, 25), 1).substr(md5(time()), 1);

または、さらに短く、わずかに速い小文字のバージョン:

chr(mt_Rand(97, 122)).substr(md5(time()), 1);

/* or */

chr(mt_Rand(ord('a'), ord('z'))).substr(md5(time()), 1);


1秒以内に多くのランダム文字列を生成しようとする人への注意:
Since
time( )秒単位の時間を返します、md5( time( ) )一定の時間内で同じになるため、1秒以内に多くのランダム文字列が生成された場合、おそらく重複する可能性があります。


以下のコードを使用してテストしました。これは小文字バージョンをテストします:

    $num_of_tests = 100000;

    $correct = $incorrect = 0;

    for( $i = 0; $i < $num_of_tests; $i++ )
    {
        $Rand_str = substr( "abcdefghijklmnopqrstuvwxyz" ,mt_Rand( 0 ,25 ) ,1 ) .substr( md5( time( ) ) ,1 );

        $first_char_of_Rand_str = substr( $Rand_str ,0 ,1 );

        if( ord( $first_char_of_Rand_str ) < ord( 'a' ) or ord( $first_char_of_Rand_str ) > ord( 'z' ) )
        {
            $incorrect++;
            echo $Rand_str ,'<br>';
        }
        else
        {
            $correct++;
        }
    }

    echo 'Correct: ' ,$correct ,' . Incorrect: ' ,$incorrect ,' . Total: ' ,( $correct + $incorrect );
29
Uours

私はこのようなものを見つけました:

$length = 10;
$randomString = substr(str_shuffle(md5(time())),0,$length);
echo $randomString;
26
23kulpamens

この質問にはもっと良い答えが必要だと思いました。コードゴルフが好き!これは、より良いランダムバイトジェネレーターも使用します。

preg_replace("/[\/=+]/", "", base64_encode(openssl_random_pseudo_bytes(8)));

明らかに、長いパスワードのバイト数を増やします。

6
maaarghk

手紙から始める必要がある場合は、これを行うことができます。面倒です...しかし、1行です。

$randomString = substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1) . substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);

echo $randomString;

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

$string = bin2hex(openssl_random_pseudo_bytes(100));

maaarghkの答え の方が優れています。

4
Rudie

base_convert(microtime(true), 10, 36);

4
Daniel Reyes

このコードを生成しました。シンプルで、短く、(かなり)エレガントです。

長さが重要でない場合は、前述のようにbase64を使用します-ただし、str_replaceを使用して「==」を削除します。

<?php
        echo  str_ireplace("==", "", base64_encode(time()));
?>
3

これを試すことができます:

 function KeyGenerator($uid) {
    $tmp = '';
    for($z=0;$z<5;$z++) {
      $tmp .= chr(Rand(97,122)) . Rand(0,100);
    }
    $tmp .= $uid;
    return $tmp;
  }
3
Saud Khan

この機能を使用します

使用法:

 echo randomString(20, TRUE, TRUE, FALSE);

  /**
   * Generate Random String
   * @param Int Length of string(50)
   * @param Bool Upper Case(True,False)
   * @param Bool Numbers(True,False)
   * @param Bool Special Chars(True,False)
   * @return String  Random String
   */
  function randomString($length, $uc, $n, $sc) {
      $rstr='';
      $source = 'abcdefghijklmnopqrstuvwxyz';
      if ($uc)
          $source .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
      if ($n)
          $source .= '1234567890';
      if ($sc)
          $source .= '|@#~$%()=^*+[]{}-_';
      if ($length > 0) {
          $rstr = "";
          $length1= $length-1;
          $input=array('a','b','c','d','e','f','g','h','i','j,''k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z')  
          $Rand = array_Rand($input, 1)
          $source = str_split($source, 1);
          for ($i = 1; $i <= $length1; $i++) {
              $num = mt_Rand(1, count($source));
              $rstr1 .= $source[$num - 1];
              $rstr = "{$Rand}{$rstr1}";
          }
      }
      return $rstr;
  }
2
Emilio Gort

それは本当にあなたの要件に依存します。

テスト実行間で文字列を一意にする必要がありましたが、他の多くの制限は必要ありませんでした。

文字で始まる文字列も必要でしたが、これは私の目的には十分でした。

$mystring = "/a" . microtime(true);

出力例:

a1511953584.0997

2
user985366

ランダムな文字で構成される文字列を生成するには、この関数を使用できます

public function generate_random_name_for_file($length=50){
    $key = '';
    $keys = array_merge(range(0, 9), range('a', 'z'));
    for ($i = 0; $i < $length; $i++) {
        $key .= $keys[array_Rand($keys)];
    }
    return $key;
}
1
Salar

私はこれを使用して、上記の他の良い例に基づいて、それらを繰り返すことなく、一度に数十の一意の文字列を生成します:

$string = chr(mt_Rand(97, 122))
          . substr(md5(str_shuffle(time() . Rand(0, 999999))), 1);

この方法で、私は〜5秒で1.000.000個の一意の文字列を生成することができました。それほど高速ではありませんが、ほんの一握り必要なだけなので大丈夫です。ちなみに、10個の文字列の生成にかかった時間は0.0001ミリ秒未満でした。

1

Base64エンコーディングは、ランダムな文字列を作成するのに役立つことがわかり、次の行を使用します。

base64_encode(openssl_random_pseudo_bytes(9));

これにより、ランダムな12桁の文字列が得られます。さらに、ランダム性が「暗号的に強い」という利点もあります。

1
Bex

OPの元のリクエストをひどい方法で一致させる方法(読みやすくするために拡張):

// [0-9] ASCII DEC 48-57
// [A-Z] ASCII DEC 65-90
// [a-z] ASCII DEC 97-122
// Generate: [A-Za-z][0-9A-Za-z]
$r = implode("", array_merge(array_map(function($a)
                             {
                                 $a = [Rand(65, 90), Rand(97, 122)];
                                 return chr($a[array_Rand($a)]);
                             }, array_fill(0, 1, '.')),
                             array_map(function($a)
                             {
                                 $a = [Rand(48, 57), Rand(65, 90), Rand(97, 122)];
                                 return chr($a[array_Rand($a)]);
                             }, array_fill(0, 7, '.'))));

最後のarray_fill()は、 '7'を長さ-1に変更します。

すべての英数字を使用する(そしてまだ遅い)場合:

// [0-9A-Za-z]
$x = implode("", array_map(function($a)
                           {
                               $a = [Rand(48, 57), Rand(65, 90), Rand(97, 122)];
                               return chr($a[array_Rand($a)]);
                           }, array_fill(0, 8, '.')));
1
EllisGL

この関数は、ランダムな小文字の文字列を返します。

function randomstring($len=10){
 $randstr='';
 for($iii=1; $iii<=$len; $iii++){$randstr.=chr(Rand(97,122));};
 return($randstr);
};
1
PavelŠ

JavaScriptソリューション:

function randomString(pIntLenght) {  
  var strChars = “0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz”;
  var strRandomstring = ”;

  for (var intCounterForLoop=0; intCounterForLoop < pIntLenght; intCounterForLoop++) {
      var rnum = Math.floor(Math.random() * strChars.length);
      strRandomstring += strChars.substring(rnum,rnum+1);
  }
   return strRandomstring;
}

alert(randomString(20));

参照URL: JavaScriptを使用してランダムな文字列を生成

PHPソリューション:

function getRandomString($pIntLength = 30) {
      $strAlphaNumericString     = ’0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;

      $strReturnString         = ”;

      for ($intCounter = 0; $intCounter < $pIntLength; $intCounter++) {
           $strReturnString .= $strAlphaNumericString[Rand(0, strlen($strAlphaNumericString) - 1)];
      }
      return $strReturnString;
}

echo getRandomString(20);

参照URL: PHPを使用してランダムな文字列を生成