生成唯一的随机字符串并插入db

时间:2012-05-20 19:28:23

标签: php mysql

我想写一个php函数,它将创建长度为4的50000唯一随机字母数字字符串并将其插入到db表中。我怎么能这样做?

4 个答案:

答案 0 :(得分:4)

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

记录在案here

编辑:替代插入方式(条纹破折号)

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

编辑值得一提:

在一个服务器中,UUID对地理位置和精确时间以及sha-1随机值进行编码。

因此,冲突概率仅存在于单独的服务器中(例如,在合并其数据集时)。

只要我们不溢出地理位置/时间段的容量,就可以保证不会在本地创建重复值。

作为优化(数据库读取速度)的问题,将UUID转换为二进制(16)字段(并使表中的列与该数据类型匹配)更快,更紧凑。

答案 1 :(得分: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++;
        }
    }
 }
}

答案 2 :(得分:1)

http://codepad.org/PoIHLzxE - 另一个简单的想法。更改为高于2的数字以生成更多;然后添加到数组并执行插入。

答案 3 :(得分:1)

使用100号码系统的字符串表示。数字将是 0,1,...,A,...,Z,...,a,...,z 这些只有62位数字,因此您应该使用其他38个字母数字字符,例如ÁáÉéÓóÖÖÖŐÚÚúŰű等。 每四个字符串应该是您的100个可能数字的一部分。从0000开始,随机添加一个数字,在数字系统10中至少为1,最大为2000.添加的结果(表示为带有100数字系统中数字的抽象含义的字符串)将是你的第一个号码。从所有数字的第二个数字开始,应该通过将相同的随机偏移量(1到2000之间)添加到最后生成的数字来生成。这样你的字符串就是唯一的。

此外,您应该生成用于插入的批处理,因为最好有50个插入,每行插入1000行,而不是有50000个数据库请求。