3

長さ4の50000個の一意のランダムな英数字文字列を作成し、それをdbテーブルに挿入する関数をphpに書きたいと思います。どうすればできますか?

4

4 に答える 4

4
for($i = 0; $i < 50000; $i++)
    $pdo->exec("INSERT INTO table_x (the_string) VALUES (UUID());");

ここに文書化されているように

編集:別の挿入方法(ダッシュのストライプ)

for($i = 0; $i < 50000; $i++)
    $pdo->exec("INSERT INTO table_x (the_string) VALUES (REPLACE(UUID(), '-', ''));");

言及する価値がある編集:

1 台のサーバー内で、UUID は地理的位置と正確な時刻を sha-1 ランダム値と共にエンコードします。

したがって、衝突の可能性は別々のサーバー内にのみ存在します (たとえば、データ セットをマージする場合)。

地域/タイム スロットの容量をオーバーフローしない限り、ローカルで重複する値が作成されないことが保証されます。

最適化 (データベースの読み取り速度) の問題として、UUID を binary(16) フィールドにキャストする (およびテーブル内の列をそのデータ型に一致させる) 方が高速でコンパクトです。

于 2012-05-20T19:30:52.570 に答える
2

この関数は、任意の文字セットと必要な長さを使用して、英数字コードの配列を生成します。連続した重複文字は生成されません。

function GenCodes($howmany=50000) {

 $charset = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
 $cl = strlen($charset);
 $codelength = 4;
 $result = array();
 $code = array();
 $lastchar = "";

 for ($x = 1; $x <=$howmany; $x++) {
    for ($i=1; $i<=$codelength; $i++) {
        while(($l = rand(1,$cl-1)) == $lastchar)
            ;
        $code[$i] = $charset[$l];
        $lastchar = $l;
    }
    $code = implode($code);
    $result[$x] = $code;
    $code = "";
    $lastchar = "";
  }
  return $result;
}

そして、これはそれらをデータベーステーブルに保存し、重複がないことを確認します。

function SaveCodes($codes) {
 global $dbHost, $dbPort, $dbUser, $dbPass, $dbName;
 $insctr = 0;
 $db = new db($dbHost, $dbPort, $dbUser, $dbPass, $dbName);
 foreach($codes as $code) {

    $sql = "select code_id from codes where code_code='".$code."'";

    $result = $db->Query($sql);
    if ($db->NumRows() == 0) {  // don't generate an in-use code
        $sql = "insert into codes (code_code) values ('".$code."')";
        $result = $db->Query($sql);
        if ($result) {
            $insctr++;
        }
    }
 }
}
于 2012-05-20T19:42:37.243 に答える
1

100 数システムの文字列表現を使用します。数字は 0、1、...、A、...、Z、...、a、...、z です。これらは 62 桁しかないため、Á á É é などの他の 38 文字の英数字を使用する必要があります。 Ó ó Ö ö Ő ő Ú Ű ű など。4 文字の各文字列は、可能な 100 桁のセットの一部である必要があります。0000 から始めて、これに数字をランダムに追加します。これは、数体系 10 で少なくとも 1 で最大 2000 になります。加算の結果 (100 数体系の数の抽象的な意味を持つ文字列として表されます) は次のようになります。あなたの最初の番号。2 番目の数値から、最後に生成された数値に同じランダム オフセット (1 から 2000 の間) を追加して、すべての数値を生成する必要があります。このようにして、文字列は一意になります。

また、挿入用のバッチを生成する必要があります。これは、50000 のデータベース リクエストを行うよりも、1000 行ずつ挿入する 50 回の挿入を行う方がよいためです。

于 2012-05-20T20:28:51.137 に答える
1

http://codepad.org/PoIHLzxE - もう 1 つの簡単なアイデア。より多く生成するには、2 より大きい数値に変更します。次に、配列に追加して挿入を実行します。

于 2012-05-20T19:34:38.703 に答える