PHP のプログラムを組んでいて、データーベースの主キー、ユーザーのID、パスワードなど、ランダム英数字がほしいときがあるかもしれません。
1からアルゴリズムを作ってランダム英数字を発行するプログラムを作るのは意外と大変ですが、PHP には、便利な関数があるので紹介します。
ユニークIDを発行する関数(uniqid)
PHP にはランダムのIDなどを発行するのに便利な関数があります。その関数というのは uniqid です。
echo uniqid();
実行結果:
5ec4ab2d28fd1
プログラム解説
uniqid 関数を使用すると13桁のIDを発行することができます。
このIDはマイクロ秒単位の現在時刻に基づいていて、基本的には同じプログラムで同じIDになることはほとんどありませんが、一意性を保証するものではありません。
uniqid 関数は引数を指定することで接頭語を指定することもできます。
echo uniqid('id_');
実行結果:
id_5ec4adb703409
IDが重なってしまうのが心配であれば、第2引数に「true」を設定することで、より重なる可能性の低い23桁のIDを発行することができます。
echo uniqid('id_', true);
実行結果:
id_5ec4aeab62c862.41682442
これでも重複するのが心配な場合は接頭語に乱数を指定すると、ほぼほぼ重複の可能性はなくなります。
for ($i = 0 ; $i < 10 ; $i++){
echo uniqid('id_'.rand().'.', true).'<br />';
}
実行結果:
id_10489.5ec941c019f6c9.01196971
id_62.5ec941c019f790.42816701
id_11935.5ec941c019f802.90627376
id_31724.5ec941c019f860.23641057
id_23477.5ec941c019f8c7.89089161
id_25162.5ec941c019f924.24506190
id_5563.5ec941c019f985.69005715
id_27352.5ec941c019f9f6.59454274
id_32305.5ec941c019fa58.33920753
id_22806.5ec941c019fab3.50518283
ここではrand 関数を使用しておりますが、今は同じ機能でより処理が早いといわれている、mt_rand 関数が主流で使われているようです。
なお、本当にmt_rand のほうが早いのかどうか試してみたところ、1000万回実行するのに、
- rand() :約2.7秒
- mt_rand(): 約2.8秒
と以外にもrand 関数のほうが少し早いという結果がでました。この結果は環境によって変わってくるかも知れません。
英数字のランダム文字列を生成
最近ではパスワードなどの条件で大文字の英字が含まれていなければいけないということが、よくありますね。
大小英数字を生成する簡単なプログラムは次となります。
$length = 8; // 生成する英数字の長さ
$chars = array_merge(range('a', 'z'), range('A', 'Z'), range('0', '9'));
shuffle($chars);
for ($i = 0 ; $i < $length ; $i++){
echo $chars[$i];
}
実行結果:
62JydDVv
プログラム解説
range 関数は第1引数に始点、第2引数に終点の値を指定すれば、その範囲の値をすべて配列に格納して返却します。
上記の場合は、小文字の「a ~ z」の文字列が入った配列が戻ってきます。
array_merge 関数は配列を連結する関数です。上記のように記述することで、大文字小文字のアルファベットと「0 ~ 9」の数字が格納された配列が生成できます。
shuffle 関数は配列の中身をシャッフルします。プログラムでは最後にこの関数を使ってシャッフルした中身の先頭から、ランダム英数字の長さ分だけ、表示させております。
このプログラムの欠点は、生成した英数字に数字が入っていなかったり、大文字が入っていなかったりする可能性があることです。
可能性は低いですが、小文字のアルファベットしか含まれていないということもあり得ます。
プログラムを繰り返し実行していれば、そのうち条件に合う結果は出ると思いますが、それでは駄目で確実に数字や大文字が1文字以上必要という場合は、もう少し手の混んだプログラムにする必要があります。
コメント