40

ランダム/一意の文字列を生成する最短の方法を探しています。そのために、次の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 文字が生成されますが、最初の文字は常にアルファベット文字になります。

ソリューション 1

しかし、Uoursは本当に改善され、彼の答えは次のようになりました。

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

短くて甘い

Anonymous2011による他の提案は非常に素晴らしいものでしたが、何らかの理由で最初の文字は常に M、N、Y、Z のいずれかであったため、私の目的には合いませんでしたが、選ばれた答えでした。それらの特定の文字をもたらしますか?

ここに私の修正版のプレビューがあります

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

準優勝

4

17 に答える 17

30

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

文字列から 1 つのランダムな文字を取得し、それに を追加します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);



time( ) 1秒 以内多くのランダム文字列を生成しようとする人への注意:md5( time( ) ) いくつかの重複が発生する可能性があります。


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

    $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 );
于 2013-09-26T02:20:55.693 に答える
6

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

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

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

于 2014-09-04T08:54:38.073 に答える
3

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

于 2014-05-25T05:08:49.787 に答える
2

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

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

<?php
        echo  str_ireplace("==", "", base64_encode(time()));
?>
于 2013-09-26T01:14:16.767 に答える
2

私はこの機能を使用します

利用方法:

 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;
  }
于 2013-09-26T01:14:58.870 に答える
1

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

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

このようにして、約 5 秒で 1.000.000 個の一意の文字列を生成できました。それほど速くはないことはわかっていますが、ほんの一握りしか必要ないので、問題ありません。ちなみに、10 個の文字列を生成するのにかかった時間は 0.0001 ミリ秒未満でした。

于 2014-11-28T15:35:45.257 に答える
1

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でランダム文字列を生成

于 2014-12-24T06:34:14.073 に答える
1

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

function randomstring($len=10){
 $randstr='';
 for($iii=1; $iii<=$len; $iii++){$randstr.=chr(rand(97,122));};
 return($randstr);
};
于 2015-08-18T05:28:39.707 に答える
1

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

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

文字で始まる文字列も必要でしたが、これで十分でした。

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

出力例:

a1511953584.0997

于 2017-11-29T11:17:29.117 に答える
1

次のワンライナーは、質問の要件を満たしています。特に、文字で始まります。

substr("abcdefghijklmnop",random_int(0, 16),1) . bin2hex(random_bytes(15))

文字列が文字で始まるかどうかを気にしない場合は、次のように使用できます。

bin2hex(random_bytes(16))

ここでは、PHP 7 で導入されたrandom_bytesとを使用していることに注意してくださいrandom_int。これは、一意の文字列を推測しにくくしたい場合に重要な要素です。、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、 、、、 、 、 、、、をtime()含む他の多くのソリューションは、はるかに予測可能であり、ランダムな文字列がパスワード、ベアラー資格情報、ナンス、セッション識別子、「検証コード」、または「確認コード」、または別の秘密の値。microtime()uniqid()rand()mt_rand()str_shuffle()array_rand()shuffle()

また、一意の識別子、特にランダムな識別子を生成する際に留意すべきその他の事項もリストします。

于 2020-07-27T16:38:28.600 に答える