当前位置:   C++ > 正文

MySQL-有效插入70000个随机唯一字符串

php,mysql,random,sql,linux,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发工具,前端开发工具,开发人员工具,站长工具

我正在做一个项目,在该项目中,我应该至少生成70000个包含8个字母数字字符的代码。密码必须唯一。目前,我正在使用php通过以下功能生成这些代码:

function random_unique_serial($length, PDO $conn) {
    $codeCheck=FALSE;
    while (!$codeCheck) {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
        $charactersLength = strlen($characters);
        $randomCode = '';
        for ($i = 0; $i < $length; $i++) {
            $randomCode .= $characters[rand(0, $charactersLength - 1)];
        }
        $sql = "SELECT * FROM codes WHERE code=:code";
        $st = $conn->prepare($sql);
        $st->bindvalue(":code", $randomCode, PDO::PARAM_STR);
        $st->execute();
        $count = $st->rowcount();
        if ($count==0) {
            $codeCheck=TRUE;
        } else {
            $codeCheck=FALSE;
        }
    }
    return $randomCode;
}

如您所见,此代码检查数据库中是否生成了每个代码,以确保它不是重复的。这在理论上应该起作用。但是,这非常慢,并且导致请求超时。我尝试增加执行时间,但这也无济于事。

然后,我决定使用数据库端方法并使用此解决方案: 使用MySQL生成随机且唯一的8个字符串

这也非常慢,并且某些生成的代码长度少于8个字符。

您能否提出更好的解决方案?



1> bishop..:

创建表结构:

CREATE TABLE t (code CHAR(8) UNIQUE CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL UNIQUE);

定义一个PHP函数以生成一个随机字符串:

function random_string(integer $length = 8): string {
    return bin2hex(mcrypt_create_iv(ceil($length/2), MCRYPT_DEV_URANDOM));
}

使用PHP构建一个多值INSERT语句,将其插入数据库,计算插入的数目,然后重复进行直到插入所需的数目:

function insert_records(\PDO $pdo, integer $need = 70000): null {
    $have = 0;
    while ($have < $need) {
        // generate multi value INSERT
        $sql = 'INSERT IGNORE INTO t VALUES ';
        for ($i = 1; $i < $need; $i++) {
            $sql .= sprintf('("%s"),', random_string());
        }
        $sql .= sprintf('("%s");', random_string());

        // pass to database and ask how many records were inserted
        $result = $pdo->query($sql);
        $count  = $result->rowCount();

        // adjust bookkeeping values so we know how many we have and how many
        // we need
        $need -= $count;
        $have += $count;
    }
}

在我的机器(Amazon Linux c2.small)上,70k条记录的运行时间约为2秒:

real    0m2.136s
user    0m1.256s
sys     0m0.212s

为了使代码更快,此代码中的相关技巧为:

发送生成所需记录数所需的最少数量的SQL语句。使用多值插入- INSERT INTO ... VALUES (), (), ... ();确实有帮助,因为它最大程度地减少了MySQL必须执行的语句处理总量并且可以告诉我们插入了多少条记录而无需执行其他查询。

使用 INSERT IGNORE以避免检查的每一个代码我们插入,这是真的很昂贵的存在。

使用最快的字符串生成功能,我们可以满足我们的需求。在我的经验中,mcrypt_create_iv是一种具有加密安全性的快速生成器,因此可以在安全性和性能之间实现理想的平衡。

使用ASCII字符集和固定宽度CHAR来消除不必要的字节开销并UNIQUE强制执行重复数据删除。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  • 如何解决《Firebase部署无需登录》经验,为你挑选了1个好方法。firebase,firebase-security,firebase-hosting,firebase-tools,安全,git,DevBox,在线流程图,编程,编程问答... [详细]

  • 如何解决《限制Firebase数据库访问一个Android应用程序》经验,为你挑选了0个好方法。android,firebase,firebase-security,firebase-realtime-database,安全,go,json... [详细]

  • 如何解决《如何从我的应用程序传递和检索内存流到DLL?》经验,为你挑选了1个好方法。delphi,dll,delphi-7,c#,安全,perl,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生... [详细]

  • 如何解决《使用JSON_MODIFY向数组添加范围》经验,为你挑选了1个好方法。sql,tsql,sql-server,json,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,uni... [详细]

  • 如何解决《Threadstatic懒惰》经验,为你挑选了1个好方法。c#,multithreading,安全,https,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线... [详细]

  • 如何解决《在python中结合'with'和'yield'是否安全?》经验,为你挑选了2个好方法。python,yield,with-statement,安全,DevBox,在线流程图,编程,编程问答,程序员... [详细]

  • 如何解决《这个反汇编如何与给定的C代码相对应?》经验,为你挑选了1个好方法。c,assembly,gcc,arm,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开... [详细]

  • 如何解决《如何使用Flask处理URL中的特殊字符》经验,为你挑选了1个好方法。python,url,flask,web,php,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,uni... [详细]

  • 如何解决《有人使用SpectreBDD框架吗?》经验,为你挑选了0个好方法。.net,c#,bdd,boo,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发工具... [详细]

  • 如何解决《Swift委托协议无法阻止保留周期问题》经验,为你挑选了0个好方法。delegates,protocols,swift,swift2,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维... [详细]

  • 如何解决《__del__()如何干扰垃圾收集?》经验,为你挑选了1个好方法。python,garbage-collection,weak-references,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,j... [详细]

  • 如何解决《当应用程序重新启动到后台时,是否会调度主队列?》经验,为你挑选了1个好方法。objective-c,grand-central-dispatch,ios,swift,安全,xcode,DevBox,在线流程图,编程,编程问答,程序... [详细]

  • 如何解决《如何使用Lazy处理并发请求?》经验,为你挑选了1个好方法。c#,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发工具,前端开发工具,开发人员工具,站... [详细]

  • 如何解决《我如何开始编写自己的防火墙?》经验,为你挑选了2个好方法。language-agnostic,firewall,windows,算法,安全,linux,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,jso... [详细]

  • 如何解决《什么是我的Groovy演示文稿中的必备封面?》经验,为你挑选了2个好方法。java,groovy,ruby,python,安全,xml,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生... [详细]

  • 如何解决《System.Windows.Automation非常慢》经验,为你挑选了1个好方法。c#,com,ui-automation,windows,安全,服务器,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,... [详细]

  • 如何解决《要使用?>或php?>》经验,为你挑选了1个好方法。php,安全,编辑器,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发工具,前端开发工具,开... [详细]

  • 如何解决《锁定传递对象会发生什么?》经验,为你挑选了1个好方法。c#,multithreading,locking,安全,go,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳... [详细]

  • 如何解决《fopen弃用警告》经验,为你挑选了4个好方法。fopen,deprecated,visual-c++,安全,go,linux,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,un... [详细]

  • 如何解决《我怎样才能获得firebase部署--email或--token参数?》经验,为你挑选了1个好方法。travis-ci,firebase,firebase-hosting,安全,DevBox,在线流程图,编程,编程问答,程序员,开... [详细]

相关标签
  

闽ICP备14008679号