ランダムなパスワードや文字列を生成する方法を6つ紹介します。
1. str_shuffle() を使う
- 同じ文字が2回出ない
- 36文字まで生成可能
<?php
function random($length = 8)
{
return substr(str_shuffle('1234567890abcdefghijklmnopqrstuvwxyz'), 0, $length);
}
2. mt_rand() を使う
- 同じ文字が複数回でる可能性がある
- 12文字まで生成可能
<?php
function random($length = 8)
{
return base_convert(mt_rand(pow(36, $length - 1), pow(36, $length) - 1), 10, 36);
}
3. md5(uniqid()) を使う
- 同じ文字が複数回でる可能性がある
- 25文字まで生成可能
<?php
function random($length = 8)
{
return substr(base_convert(md5(uniqid()), 16, 36), 0, $length);
}
sha256にすることで48文字まで生成可能になる
<?php
function random($length = 8)
{
return substr(base_convert(hash('sha256', uniqid()), 16, 36), 0, $length);
}
4. array_reduce() を使う
- 同じ文字が複数回でる可能性がある
- 何文字でも生成可能
<?php
function random($length = 8)
{
return array_reduce(range(1, $length), function($p){ return $p.str_shuffle('1234567890abcdefghijklmnopqrstuvwxyz')[0]; });
}
5. opensslを使う
PHP - ランダムなパスワードを1行で生成する with openssl - Qiita
6. str_repeat + str_shuffle
- 同じ文字が複数回でる可能性がある
- 何文字でも生成可能
<?php
function random($length = 8)
{
return substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyz', $length)), 0, $length);
}
参考: [PHP] 一行でランダムパスワードを得る方法 : してログ - LANDHERE
7. random_bytes
- PHP7で追加された暗号学的に安全なランダムバイト生成するrandom_bytes関数を使う。
- 同じ文字が複数回でる可能性がある
- 出現する文字は
0
-9
,a
-f
のみ - 何文字でも生成可能
function random($length = 8)
{
return substr(bin2hex(random_bytes($length)), 0, $length);
}
最後までお読みくださりありがとうございました。Twitterでは、Qiitaに書かない技術ネタなどもツイートしているので、よかったらフォローお願いします→Twitter@suin
コメント@suin リンクをコピー このコメントを報告 0 @Aquanaut-Kato リンクをコピー このコメントを報告 2
UPDATED 2013/03/02 3を追加した
突然、すみません。
どのような利用を想定しているか分かりませんが、1.などの「同じ文字が2回出ない」という制約は、少々よろしくないかと。
1.で8桁の通りの数は「36*35*34*33*32*31*30*29」
ランダムで8桁の通りの数は「36^8」
計算すれば明らかですが 2倍以上甘くなります。
ご承知の上で書いておられるなら、申し訳ありません。
ただ、紹介するのであれば注意書きなどがないと安易に利用してしまう初心者もあるかも知れんせん。
まあ、phpで気軽に生成している以上、気軽に使ってもよい前提ではあると思います。