2009年5月1日(金)

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));
?>
  • 1.57205200195 sec、遅い

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まで落ちた、もうこのぐらいでいいか。