長さ4の50000個の一意のランダムな英数字文字列を作成し、それをdbテーブルに挿入する関数をphpに書きたいと思います。どうすればできますか?
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) フィールドにキャストする (およびテーブル内の列をそのデータ型に一致させる) 方が高速でコンパクトです。
この関数は、任意の文字セットと必要な長さを使用して、英数字コードの配列を生成します。連続した重複文字は生成されません。
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++;
}
}
}
}
100 数システムの文字列表現を使用します。数字は 0、1、...、A、...、Z、...、a、...、z です。これらは 62 桁しかないため、Á á É é などの他の 38 文字の英数字を使用する必要があります。 Ó ó Ö ö Ő ő Ú Ű ű など。4 文字の各文字列は、可能な 100 桁のセットの一部である必要があります。0000 から始めて、これに数字をランダムに追加します。これは、数体系 10 で少なくとも 1 で最大 2000 になります。加算の結果 (100 数体系の数の抽象的な意味を持つ文字列として表されます) は次のようになります。あなたの最初の番号。2 番目の数値から、最後に生成された数値に同じランダム オフセット (1 から 2000 の間) を追加して、すべての数値を生成する必要があります。このようにして、文字列は一意になります。
また、挿入用のバッチを生成する必要があります。これは、50000 のデータベース リクエストを行うよりも、1000 行ずつ挿入する 50 回の挿入を行う方がよいためです。
http://codepad.org/PoIHLzxE - もう 1 つの簡単なアイデア。より多く生成するには、2 より大きい数値に変更します。次に、配列に追加して挿入を実行します。