Php 生成500万个唯一代码

Php 生成500万个唯一代码,php,Php,我正在寻找一种有效的方法来生成500万个7个字符(字母、数字、特殊字符)的唯一代码 基本上,我的想法是生成一个具有唯一约束的表。然后生成一个代码,把它插入数据库,看看它是否被“接受”(意思是一个新的代码),直到我们有500万个唯一的代码 或者,他们的想法是生成一个包含500万个唯一代码的数组,然后立即将它们插入数据库,以查看有多少代码进入数据库(是唯一的) 第三个选项是创建一个代码,检查它是否已经存在,如果不存在,则将其插入数据库 我现在的问题是我应该使用什么方法——我可能会监督一个问题。还是有

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

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

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

第三个选项是创建一个代码,检查它是否已经存在,如果不存在,则将其插入数据库

我现在的问题是我应该使用什么方法——我可能会监督一个问题。还是有更好的办法


非常感谢

需要将您想要的代码插入数据库吗

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

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

伪代码:

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

  • 然后立即在数据库中插入此哈希表或数组


  • 选择适当的函数生成一个随机码;为了便于说明,我将使用以下内容:

    function generateCode() {
        return substr(bin2hex(random_bytes(4)), 0, 7);
    }
    
    请参阅和其他答案,以选择适合您的内容。重要的一点是,它使用了一个很好的随机性源,或者
    /dev/uradom
    。这将最小化对该函数的两次调用产生相同输出的机会

    在此基础上,只需使用阵列键消除重复数据:

    $codes = [];
    
    while (count($codes) < 5000000) {
        $codes[generateCode()] = null;
    }
    
    $codes = array_keys($codes);
    
    $codes=[];
    而(计数($code)<5000000){
    $code[generateCode()]=null;
    }
    $codes=数组_键($codes);
    
    如果
    generateCode
    具有足够的随机性,则冲突应该很少,并且以这种方式生成代码的开销应该不会太大。即使如此,这大概是一次性操作,效率也不是最重要的。500万个短字符串应该可以毫无问题地放入内存。然后,您可以将它们全部批量插入数据库

    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;
    }
    

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

    鉴于生成唯一标识符的目的(很难猜到优惠券代码),我想说的是,您应该生成一个组合了“唯一”部分和“随机”部分的

    • “唯一”部分可以是一个单调递增的计数器(如支持数据库中的自动递增行数),它可以选择性地用作整个周期的种子(在重复之前,它伪随机地循环其周期中的所有可能值)
    • “随机”部分只是一个由加密随机数生成器生成的随机数(对于PHP,它是
      random\u int
      )。一般来说,随机部分越长,预测性就越差

    此外,为了生成唯一的优惠券代码,没有理由将自己限制为7个字符的代码,特别是如果最终用户不需要直接输入这些代码。另请参见。

    您可以使用uuid-。请参见碰撞块。只需将其用作您的db@myxaxaUUID不是7位数字……代码必须满足哪些先决条件?因为如果没有,只需使用0000001-5000000。其他解决方案:在插入代码之前,创建并检查1000或10000或类似的代码。一个接一个地插入它们将需要数据库的支持。创建500万将需要一些内存,如果它在结束前崩溃,您将不得不重新启动所有作业。编程是折衷的。@DoktorOSwaldo-我们想使用数字、字母、特殊字符;大写和小写。那么为什么不使用集合呢<代码>$set=new\Ds\set()$设置->添加(生成代码)每个定义都没有重复项。同样好,我承认我最近没有跟上PHP中可用的内容。啊,对不起,我必须承认我忘了它在扩展(PHP ds)中。
    $codes = array();
    while(count($codes)!=5000000){
       $code =  generateRandomString();
       $codes[$code] =  $code;
    }