データを新規登録する際、既存データの中の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);//データ数
}

回答の条件
  • 1人1回まで
  • 登録:2007/11/19 03:11:26
  • 終了:2007/11/27 08:32:12

回答(1件)

id:t_shiono No.1

t_shiono回答回数256ベストアンサー獲得回数222007/11/19 07:19:55

ポイント60pt

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

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

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません