我需要为客户端生成数千(可能是数百万)个唯一代码。这些代码可能具有货币价值,因此它们必须是随机的,并且聪明的黑客不会发现和利用任何模式。
我已经研究了生成代码的各种解决方案(循环生成=可能被猜测,风险太大,uniqid()
=好,但我可能需要不同长度的代码。)
现在我正在考虑使用AZ和0-9 MINUS VOWELS生成代码(为了确保不会意外生成粗鲁的单词),尽管将来可能会增加小写字符等。
到目前为止,我有这个:
编辑:Per @ kingero的评论,在下面,我已经提升了一个解决方案中的随机性,因为mt_rand
取代function generateCode($length = 12) {
$chars = 'BCDFGHJKLMNPQRSTVWXYZ0123456789';
$count = mb_strlen($chars);
for ($i = 0, $result = ''; $i < $length; $i++) {
$randomIndex = devurandom_rand(0, $count - 1);
$result .= mb_substr($chars, $randomIndex, 1);
}
return $result;
}
// CUSTOM RAND FUNCTION
// equiv to rand, mt_rand
// returns int in *closed* interval [$min,$max]
function devurandom_rand($min = 0, $max = 0x7FFFFFFF) {
$diff = $max - $min;
if ($diff < 0 || $diff > 0x7FFFFFFF) {
throw new RuntimeException("Bad range");
}
$bytes = mcrypt_create_iv(4, MCRYPT_DEV_URANDOM);
if ($bytes === false || strlen($bytes) != 4) {
throw new RuntimeException("Unable to get 4 bytes");
}
$ary = unpack("Nint", $bytes);
$val = $ary['int'] & 0x7FFFFFFF; // 32-bit safe
$fp = (float) $val / 2147483647.0; // convert to [0,1]
return round($fp * $diff) + $min;
}
的自定义rand函数:
{{1}}
这是非常基本的,所以我显然担心它不够随意。谁能告诉我这是否是确保生成的代码真正随机的好方法?
(注意:显然,一个想成为黑客的黑客总是可以尝试进行暴力攻击。这种尝试将在别处处理,我只是想确保这些代码真的是随机的。)
答案 0 :(得分:1)
我使用以下实现,希望对您有用:
function createRandStr($length, $spChars = false){
$alpha = 'abcdefghijklmnopqrstwvxyz';
$alphaUp = strtoupper($alpha);
$num = '12345678901234567890';
$sp = '@/+.*-\$#!)[';
$thread = $alpha.$alphaUp.$num;
if ($spChars) $thread .= $sp;
$str = '';
for ($i = 0; $i < $length; $i++){
$str .= $thread[mt_rand(0, strlen($thread)-1)];
}
return $str;
}
查看此直播演示:http://codepad.org/QnvP7fFl