我正在寻找一种有效的方法来生成具有7个字符(字母,数字,特殊字符)的500万个唯一代码。
基本上,我的想法是生成具有唯一约束的表。然后生成一个代码,将其插入数据库,看看它是否被“接受”(表示新代码),直到我们拥有500万个唯一代码为止。
或者,他们的想法是生成一个包含500万个唯一代码的数组,然后将它们立即一次插入数据库中,以查看有多少代码使其成为数据库(唯一)。
第三个选择是创建一个代码,检查它是否已经存在,如果没有将其插入数据库中。
我现在的问题是我应该使用哪种方法-可能有一个我忽略的问题。还是有更好的方法?
非常感谢!
答案 0 :(得分:3)
选择适当的函数以生成一个随机代码;出于说明目的,我将使用它:
function generateCode() {
return substr(bin2hex(random_bytes(4)), 0, 7);
}
请参阅https://stackoverflow.com/a/22829048/476和其中的其他答案,以选择适合您的内容。重要的一点是,它使用了良好的随机性源,它们是random_bytes
,random_int
,openssl_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,它将“唯一”部分和“随机”组合在一起“部分。
random_int
)生成的随机数。通常,随机部分越长,可预测性就越差。此外,出于生成唯一优惠券代码的目的,没有理由将自己限制为7个字符的代码,尤其是在不需要最终用户直接输入这些代码的情况下。另请参见this question。
答案 3 :(得分:1)
是否需要在数据库中插入您想要的代码?
最好不要不断地向数据库请求并尝试它是否唯一。
您可以先将代码存储到数组中,然后再将其存储到数据库中。
伪代码:
生成唯一的500万个代码,插入到哈希表或数组中。 //在插入新哈希表时检查哈希表是否存在。
然后您现在将此哈希表或数组插入数据库中。