・重複しない
・ランダムな16桁の数字
を作りたいです。
5万個ぐらい作りたいです。
md5だと英字も入ってしまうし・・・
良い方法を教えてください。
perlなんですけど...一応動きます
#!/bin/perl
srand(0);
# 乱数が重複する可能性があるのでfor文は無理
$i = 0;
while($i < 50000) {
# 上位8桁、下位8桁を乱数で求める
$h = rand(100000000); $l = rand(100000000);
# 文字に変換する
$s = sprintf(”%08d08%d”, $h, $l);
# 数値のキーだと何かおかしな動作をしそうなので...
$k = ”k” + $s;
# まだ定義されていない乱数の場合
unless(defined($val{$k})) {
# 連想配列に追加
$val{$k} = $s;
$i++;
}
}
# 乱数の出力
while(($n, $v) = each(%val)) {
print(”$v¥n”);
}
http://www.stackasterisk.jp/tech/php/php03_08.jsp
PHP第3回:PHP応用(配列:foreach/array_walk/array_rand)
URLにランダムでパスワードを生成するサンプルプログラムがあります。このプログラムではパスワードに使用する文字を$pwelemstrという変数に入れています。ここで数字だけを入れてパスワード長を16桁にすればランダムに作ることができるでしょう。重複しないためには生成済みのパスワードをDBにでも格納して新しいパスワードを生成するたびに同じ数字が発生していないかを確認するようにすれば問題ないでしょう。
http://psbweb.mirrors.phpclasses.org/browse/package/1738.html
Guid (MD5, guid) - PHP Classes
GUIDはいかがでしょうか?
http://www.phpclasses.org/browse/package/1738.html
Guid (MD5, guid) - PHP Classes
http://www.atmarkit.co.jp/icd/root/52/94084052.html
Insider's Computer Dictionary [GUID] − @IT
GUIDの解説(ご参考用)
http://en.wikipedia.org/wiki/GUID
Globally Unique Identifier - Wikipedia, the free encyclopedia
GUIDの解説(ご参考用)
GUIDの仕様書(ご参考用)
ありがとうございます!
GUID
http://jp2.php.net/function.mt_rand
PHP: mt_rand - Manual
再回答で失礼します。
■上記URLにPHPのmt_rand()(Mersenne Twister型乱数生成)を用いて
16桁のランダム文字列を生成するコードが掲載されています。
対象文字列を数字のみに限定すれば、活用できるのではないでしょうか。
生成された文字列が重複していないかどうかの確認は
例えばこうなります。
一例
(1)配列Aには、上記方法で生成した16桁の文字列が5万個入っている。
(2)配列Aを配列Bにコピーする。
(3)配列Bを文字列としてソートする。(昇順もしくは降順)
(4)配列Bについて、添え字0の文字列と添え字1の文字列が重複していないかチェック。
(5)配列Bについて、添え字1の文字列と添え字2の文字列が重複していないかチェック。
(6)このようにして隣接した文字列が重複していないかどうかを配列Bの全範囲についてチェックする。
(7)重複が確認されなかったら、配列Aは所定の仕様を満たしたことになる。
もしも重複が出るようでしたら、配列Aにあらかじめ5万個以上(例えば10万個)の文字列を
収納しておき、(6)の照合作業時に重複したものが見つかった場合、
削除すればいいでしょう。
■1回目の回答のGUID、一度生成された数値が再度出現する確率は限りなくゼロですので、
ひたすら生成を繰り返せば、取得できます。
一例
(1)(10進数で)16桁以下の数値が5万個出現するまで生成を繰り返す。
(16桁未満の数字は頭にゼロを補って、16桁とみなす。)
(2)GUID(128bit長)を5万個生成し、それらの(10進数で)下位16桁を取得する。
もしくは5万個以上生成して配列に格納した上で、前述手法で重複の確認・削除をする。
ありがとうございます!
ランダムパスワード生成