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

データを新規登録する際、既存データの中の4桁ユニークキーと被らないように4桁ユニークキーを発行し登録するスクリプトを作ってみました。

検証してユニークキーが発行され登録されるのですが、本当に被ってないか不安です。
自分で書いといてなんですが、以下ソースコードで問題ないでしょうか?

$totalRows_RsAdddata = 1;
while ($totalRows_RsAdddata != 0) {
srand((double)microtime()*1000000);
$r = rand();
while (!ereg('[a-zA-Z]',substr(md5($r),0,4)) || !ereg('[0-9]',substr(md5($r),0,4))) {
$r = rand();
}

$uid = substr(md5($r),0,4);

mysql_select_db($database_connDB, $connDB);
$query_RsAdddata = "SELECT q06 FROM test_adddata WHERE q06 = '$uid'";
$RsAdddata = mysql_query($query_RsAdddata, $connDB) or die(mysql_error());
$totalRows_RsAdddata = mysql_num_rows($RsAdddata);//データ数
}

●質問者: php-beginner
●カテゴリ:インターネット ウェブ制作
✍キーワード:DOUBLE md5 Rand SELECT キー
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● t_shiono
●60ポイント

重複しないかという点については、このスクリプトが並列実行されるかどうかに依存します。

DBにすでに発行したユニークキーを格納し、過去に発行したかどうかを確認していますが、チェック確認後に別のスレッドやプロセスなどのスクリプトがDBに確認後書き込むと重複してしまいます。

それと可能性のある文字列が登録されている状態ですと無限ループに陥ります。


あとは、細かいことかもしれませんが、

md5は第二引数にTRUEを指定しないと、16進の文字列を返すので、eregで行っているチェックは不要に感じるのと、仮に必要だとしても、先に$uidを計算するようにした方が効率的です。

http://jp2.php.net/manual/ja/function.md5.php

それに、すべての英数字を利用したいのであれば、文字列生成部もmd5ではなく変更する必要があります。


また、randも範囲を指定してあげないとユニークキーの上限も抑えられてしまうかもしれませんし、srandは不要かもしれません(バージョン不明ですが)

注意: (Windows のような)いくつかのプラットフォームでは、RAND_MAX は 32768 と小さな値となっています。 32768 より広い範囲にしたい場合、 min および max を指定することで、 RAND_MAX より大きな範囲の乱数を生成することができます。 もしくは、 mt_rand() をかわりに使用してみてください。

注意: PHP 4.2.0 以降、 srand() または mt_srand() によりランダム数生成器にシードを与える必要はありません。これは、この処理が自動的に行われるためです。

http://jp2.php.net/manual/ja/function.rand.php


また、同様質問です。

http://q.hatena.ne.jp/1107225699

関連質問


●質問をもっと探す●



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