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