PHPでランダム文字列を生成する方法をサンプルコード付き解説!
自動でパスワード生成したり、CSRF対策の際にワンタイムトークンを生成するにもランダムな文字列を生成するが必要です。PHPではランダムな文字列を生成するために関数がいくつか用意されています。この記事ではPHPでランダム文字列を生成する方法を解説しています。
PHPでランダム文字列を生成する方法
それではPHPでランダム文字列を生成する方法をサンプルコードを使って、パターンごとに解説していきましょう。
mt_rand関数
// mt_rand関数
$str1 = chr(mt_rand(97, 122));
for($i = 0; $i < 10; $i++){
$str1 .= chr(mt_rand(97, 122));
}
mt_rand
関数は乱数を生成する関数ですが、chr
関数と組み合わせて使うことでランダムな文字列を生成することもできます。
chr
関数は引数に数値を指定することで1バイトの文字を生成することができます。ASCIIコードによる文字変換が行われるため、97
を指定することで「a」、122
を指定することで「z」を返してくれます。
mt_rand
関数は第一引数で最小値、第二引数で最大値を指定することが出来ます。
よって、mt_rand
関数の引数に97
,122
を指定すると97
から122
の間でランダムな数字を返してくれるので、そのランダムな数字をchr
関数の引数に指定することでaからzの文字をランダムに取得することが出来ます。この方法で取得できるランダムな文字をfor
文などを使うことで任意の文字列長のランダムな文字列を生成することが出来ます。
str_shuffle関数
// str_shuffle関数
$str2 = substr(str_shuffle("ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz0123456789"), 0, 16);
str_shuffle
関数は引数に文字列を指定することで、その文字列をランダムにシャッフルした文字列を返してくれます。
今回はstr_shuffle
関数の引数に全ての英数字を指定し、返ってきた文字列をsubstr
関数で先頭から16文字目までを切り取ることで16文字のランダムな文字列を生成することが出来ます。
uniqid関数
// uniqid関数
$str3 = uniqid();
uniqid
関数はマイクロ秒単位の現在時刻にもとづいた一意なIDを生成することが出来ます。デフォルトで戻り値の13文字の文字列が返されます。
md5関数
// md5関数
$str4 = md5(uniqid());
先ほど紹介したuniqid
関数で生成した一意なID文字列をさらにmd5
関数を用いてハッシュ化することでより複雑なランダム文字列を生成することが出来ます。
ハッシュ化とは文字列をあるルールに基づいて(ハッシュ関数)別の文字列へと変換させることであり、ハッシュ化した文字列からハッシュ化する前の元の文字列に戻すことはできません。
そのため、パスワードをDBなどに保存する際にはパスワード文字列をハッシュ化して保存することが多いです。
openssl_ramdom_pseudo_bytes関数
// opennssl_random_pseudo_bytes関数
$str5 = bin2hex(openssl_random_pseudo_bytes(16));
openssl_ramdom_pseudo_bytes
関数はランダムなバイト文字列を生成することが出来ます。生成されたランダムなバイト文字列をbin2hex
関数を用いることで16進数文字列へ変換を行っております。
openssl_ramdom_pseudo_bytes
関数で生成されるランダムなバイト文字列は暗号学的に安全な文字列なので、CSRF対策を行う際のワンタイムトークンを生成する際に、この手法がよく使われます。