ランダムな文字列を生成する

なんか一時期はやっていたの?と思ったらそうでもなさそう。三つ目なんか2005年だし。

以前仮パスワードを生成する必要があったときに、以下のようなコードを書いた*1

// 乱数→md5(バイナリ)→base64→+/を除去→先頭6文字→小文字
strtolower( substr( str_replace( array('+', '/'), '', base64_encode( hash('md5',mt_rand(),true) ) ), 0, 6) );

注意としてはbase64では変換対象のビット数が6の倍数になるように後ろに0のビットを付加するので、変換対象が6の倍数になるようにしないとバランスがおかしくなる*2

//英数字のみ
preg_replace("/[^[:alnum:]]/", "", base64_encode(hash("sha384", mt_rand(),true)));
//アルファベットのみ
preg_replace("/[^[:alpha:]]/", "", base64_encode(hash("sha384", mt_rand(),true)));
//数字のみ
preg_replace("/[^[:digit:]]/", "", hash("whirlpool", mt_rand()));

*1:=を除去しないのは先頭6文字のみのため。小文字にするのはそういう変な要求があったため。

*2:md5は128ビットなので上のコードはまずかった…。ただしここでは先頭6文字しか使っていないので問題ない。小文字にしていることで数字の出現確率が半減する方が問題かもしれない。