人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

phpで
・重複しない
・ランダムな16桁の数字
を作りたいです。
5万個ぐらい作りたいです。

md5だと英字も入ってしまうし・・・
良い方法を教えてください。


●質問者: kunitz
●カテゴリ:コンピュータ
✍キーワード:md5 PHP ランダム 数字
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● dev_zer0
●10ポイント

http://www.edu.ics.saitama-u.ac.jp/~eduics/lect/html_enshu/t...

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”);

}


2 ● pingoo
●20ポイント

http://www.stackasterisk.jp/tech/php/php03_08.jsp

PHP第3回:PHP応用(配列:foreach/array_walk/array_rand)

URLにランダムでパスワードを生成するサンプルプログラムがあります。このプログラムではパスワードに使用する文字を$pwelemstrという変数に入れています。ここで数字だけを入れてパスワード長を16桁にすればランダムに作ることができるでしょう。重複しないためには生成済みのパスワードをDBにでも格納して新しいパスワードを生成するたびに同じ数字が発生していないかを確認するようにすれば問題ないでしょう。

◎質問者からの返答

ありがとうございます!

ランダムパスワード生成


3 ● Beth
●20ポイント

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の解説(ご参考用)

http://www.webdav.org/specs/draft-leach-uuids-guids-01.txt

GUIDの仕様書(ご参考用)

◎質問者からの返答

ありがとうございます!

GUID


4 ● Beth
●20ポイント

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万個以上生成して配列に格納した上で、前述手法で重複の確認・削除をする。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ