我想编写一个 php 函数,该函数将创建 50000 个长度为 4 的唯一随机字母数字字符串并将其插入到 db 表中。我该怎么做?
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(), '-', ''));");
编辑值得一提:
在单个服务器中,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++;
}
}
}
}
http://codepad.org/PoIHLzxE - 另一个简单的想法。更改为大于 2 的数字以生成更多;然后添加到数组并执行插入。
使用 100 数字系统的字符串表示。数字将是 0、1、...、A、...、Z、...、a、...、z 这些只有 62 位数字,因此您应该使用其他 38 个字母数字字符,例如 Á á É é Ó ó Ö ö Ő ő Ú ú Ű ű 等等。每个四个字符串都应该是您的 100 个可能数字集的一部分。您从 0000 开始并随机添加一个数字,该数字在数字系统 10 中至少为 1,最大为 2000。添加的结果(表示为具有 100 数字系统中数字的抽象含义的字符串)将是你的第一个号码。从第二个数字开始,您应该通过将相同的随机偏移量(1 到 2000 之间)添加到最后生成的数字来生成所有数字。这样你的字符串将是独一无二的。
此外,您应该为插入生成批次,因为最好有 50 个插入,每个插入 1000 行,而不是有 50000 个数据库请求。