ランダム/ユニークな文字列を生成する最短の方法を探しています。そのために、次の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文字を生成しますが、最初の文字とアルファベット文字を常に生成します。
しかし、oursは本当に改善され、彼の答えは;
substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1).substr(md5(time()),1);
短くて甘い
Anonymous2011による他の提案は非常に素晴らしかったが、何らかの理由で最初のキャラクターは常にM、N、Y、Zのいずれかでしたので、私の目的に合わなかったが、選ばれた答えだったでしょう。それは常にそれらの特定の文字をもたらすだろうか?
これが私の修正版のプレビューです
echo rtrim(base64_encode(md5(microtime())),"=");
アルファベット文字列をシャッフルするよりも、単一のランダムな文字を取得する方が迅速です。
文字列から単一のランダムな文字を取得し、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秒以内に多くのランダム文字列を生成しようとする人への注意:
Sincetime( )
秒単位の時間を返します、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 );
私はこのようなものを見つけました:
$length = 10;
$randomString = substr(str_shuffle(md5(time())),0,$length);
echo $randomString;
この質問にはもっと良い答えが必要だと思いました。コードゴルフが好き!これは、より良いランダムバイトジェネレーターも使用します。
preg_replace("/[\/=+]/", "", base64_encode(openssl_random_pseudo_bytes(8)));
明らかに、長いパスワードのバイト数を増やします。
手紙から始める必要がある場合は、これを行うことができます。面倒です...しかし、1行です。
$randomString = substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1) . substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);
echo $randomString;
base_convert(microtime(true), 10, 36);
このコードを生成しました。シンプルで、短く、(かなり)エレガントです。
長さが重要でない場合は、前述のようにbase64を使用します-ただし、str_replaceを使用して「==」を削除します。
<?php
echo str_ireplace("==", "", base64_encode(time()));
?>
これを試すことができます:
function KeyGenerator($uid) {
$tmp = '';
for($z=0;$z<5;$z++) {
$tmp .= chr(Rand(97,122)) . Rand(0,100);
}
$tmp .= $uid;
return $tmp;
}
この機能を使用します
使用法:
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;
}
それは本当にあなたの要件に依存します。
テスト実行間で文字列を一意にする必要がありましたが、他の多くの制限は必要ありませんでした。
文字で始まる文字列も必要でしたが、これは私の目的には十分でした。
$mystring = "/a" . microtime(true);
出力例:
a1511953584.0997
ランダムな文字で構成される文字列を生成するには、この関数を使用できます
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;
}
私はこれを使用して、上記の他の良い例に基づいて、それらを繰り返すことなく、一度に数十の一意の文字列を生成します:
$string = chr(mt_Rand(97, 122))
. substr(md5(str_shuffle(time() . Rand(0, 999999))), 1);
この方法で、私は〜5秒で1.000.000個の一意の文字列を生成することができました。それほど高速ではありませんが、ほんの一握り必要なだけなので大丈夫です。ちなみに、10個の文字列の生成にかかった時間は0.0001ミリ秒未満でした。
Base64エンコーディングは、ランダムな文字列を作成するのに役立つことがわかり、次の行を使用します。
base64_encode(openssl_random_pseudo_bytes(9));
これにより、ランダムな12桁の文字列が得られます。さらに、ランダム性が「暗号的に強い」という利点もあります。
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, '.')));
この関数は、ランダムな小文字の文字列を返します。
function randomstring($len=10){
$randstr='';
for($iii=1; $iii<=$len; $iii++){$randstr.=chr(Rand(97,122));};
return($randstr);
};
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を使用してランダムな文字列を生成