生成500万个唯一代码

时间:2019-05-23 08:37:55

标签: php

我正在寻找一种有效的方法来生成具有7个字符(字母,数字,特殊字符)的500万个唯一代码。

基本上,我的想法是生成具有唯一约束的表。然后生成一个代码,将其插入数据库,看看它是否被“接受”(表示新代码),直到我们拥有500万个唯一代码为止。

或者,他们的想法是生成一个包含500万个唯一代码的数组,然后将它们立即一次插入数据库中,以查看有多少代码使其成为数据库(唯一)。

第三个选择是创建一个代码,检查它是否已经存在,如果没有将其插入数据库中。

我现在的问题是我应该使用哪种方法-可能有一个我忽略的问题。还是有更好的方法?

非常感谢!

4 个答案:

答案 0 :(得分:3)

选择适当的函数以生成一个随机代码;出于说明目的,我将使用它:

function generateCode() {
    return substr(bin2hex(random_bytes(4)), 0, 7);
}

请参阅https://stackoverflow.com/a/22829048/476和其中的其他答案,以选择适合您的内容。重要的一点是,它使用了良好的随机性源,它们是random_bytesrandom_intopenssl_random_pseudo_bytes/dev/urandom。这样可以最大程度地减少两次调用此函数产生相同输出的机会。

从那里开始,只需使用数组键对值进行重复数据删除:

$codes = [];

while (count($codes) < 5000000) {
    $codes[generateCode()] = null;
}

$codes = array_keys($codes);

如果 generateCode足够随机,则以这种方式生成代码的冲突应该很少,并且开销也不应太大。即使这只是一次操作,效率也不是最重要的。 500万个短字符串当然应该可以毫无问题地装入内存。然后,您可以将它们全部批量插入数据库。

答案 1 :(得分:2)

function generateRandomString($length = 7) {

    // you can update these with new chars
    $characters = '!@#$%^&*()_+0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $charactersLength; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

现在使用数组存储代码:

$codes = array();
while(count($codes)!=5000000){
   $code =  generateRandomString();
   $codes[$code] =  $code;
}

$codes键和值都具有相同的代码。

答案 2 :(得分:2)

鉴于您要生成唯一标识符(如难以猜测的优惠券代码)的目的,我想说的是,您应该生成一个unique identifier,它将“唯一”部分和“随机”组合在一起“部分。

  • “唯一”部分可以是单调递增的计数器(例如支持数据库中的自动递增的行号),可以选择用作全周期linear congruential generator(通过伪随机循环通过)的种子。重复之前其时段内的所有可能值)。
  • “随机”部分只是由密码随机数生成器(对于PHP为random_int)生成的随机数。通常,随机部分越长,可预测性就越差。

此外,出于生成唯一优惠券代码的目的,没有理由将自己限制为7个字符的代码,尤其是在不需要最终用户直接输入这些代码的情况下。另请参见this question

答案 3 :(得分:1)

是否需要在数据库中插入您想要的代码?

最好不要不断地向数据库请求并尝试它是否唯一。

您可以先将代码存储到数组中,然后再将其存储到数据库中。

伪代码:

  1. 生成唯一的500万个代码,插入到哈希表或数组中。 //在插入新哈希表时检查哈希表是否存在。

  2. 然后您现在将此哈希表或数组插入数据库中。

相关问题