PHPで0から2の160乗-1までの16進数ランダム文字列
- “98d759f608938d17f5f0ce9a02272179fe4cdc72″とかっていう文字列を返したい。
まず普通に一文字ずつ40文字足してみる
<?php
for($i=0; $i<1000; $i++)
for($str="",$j=0; $j<40; $j++)
$str .= dechex(mt_rand(0,0xF));
?>
5文字ずつ足してみる
<?php
for($i=0; $i<1000; $i++)
for($str="",$j=0; $j<8; $j++)
$str .= str_pad(dechex(mt_rand(0,0xFFFFF)), 5, "0");
?>
- mt_randの最大数が0x7FFFFFFFなので仕方なく割り切れる5を使う
- 0.469032049179 sec、突然早い、mt_randが遅いのかも?
str_padとかdechexじゃなくて、sprintfでやってみる
<?php
for($i=0; $i<1000; $i++ )
for($str="", $j=0; $j<8; $j++)
$str .= sprintf("%05x", mt_rand(0,0xFFFFF));
?>
- 0.318977832794 sec、また早くなった、sprintfすごい
じゃあ、全部sprintfに任せてみる
<?php
for($i=0; $i<1000; $i++ )
$str=sprintf("%05x%05x%05x%05x%05x%05x%05x%05x",
mt_rand(0,0xFFFFF),
mt_rand(0,0xFFFFF),
mt_rand(0,0xFFFFF),
mt_rand(0,0xFFFFF),
mt_rand(0,0xFFFFF),
mt_rand(0,0xFFFFF),
mt_rand(0,0xFFFFF),
mt_rand(0,0xFFFFF));
?>
- 0.176548957825 sec、一気に半分!
そんなら、5文字にこだわる必要ない
<?php
for($i=0; $i<1000; $i++ )
$str=sprintf("%07x%07x%07x%07x%07x%05x",
mt_rand(0,0xFFFFFFF),
mt_rand(0,0xFFFFFFF),
mt_rand(0,0xFFFFFFF),
mt_rand(0,0xFFFFFFF),
mt_rand(0,0xFFFFFFF),
mt_rand(0,0xFFFFF));
?>
- 0.137782096863 sec、最初の10分の1まで落ちた、もうこのぐらいでいいか。