我有一些我正在使用的代码
function genCode ($entropy=1) {
$truCde = "";
$indx = 0;
$leng = 30*$entropy;
while ($indx < $leng) {
$code = "";
$length = 100*$entropy;
$index = 0;
while ($index < $length) {
$code .= rand();
$index++;
}
$index = 0;
while ($index < $length) {
$code = sha1($code);
$index++;
}
$truCde .= $code;
$indx++;
}
$finalCode = sha1(rand()) . hash("sha256",$truCde . md5($entropy*rand()));
$finalCode .= sha1(md5(strlen($finalCode)*$entropy));
return hash (
"sha256",
sha1($finalCode) . sha1(md5($finalCode)) . sha1(sha1($finalCode))
);
}
生成电子邮件验证的随机代码。是否有代码花费更少的时间来生成随机代码。运行此代码大约需要1-2秒,但我希望减少.7秒,因为脚本的其余部分需要更长的时间。
答案 0 :(得分:7)
那是大规模的过度杀伤力。重复调用rand()
不会使代码“更随机”,也不会使用SHA和MD5哈希的随机组合。这些复杂性都不会改善验证码。
会产生影响的改进是使用mt_rand()
而不是rand()
。 Mersenne Twister伪RNG比大多数默认rand()
实现强得多。 PHP文档提示rand()
最多可以在2 15 ,这意味着您只能生成32,768个唯一验证码。
除此之外,单个哈希调用也可以。
sha1(mt_rand())
(你甚至不需要调用哈希函数,因为你的代码的不可预测性将来自随机数生成器,而不是哈希函数。但哈希函数具有创建长十六进制字符串的良好副作用“看起来“更好。”
答案 1 :(得分:2)
如果您只是想生成随机字符串来测试某人有权访问电子邮件地址,或类似的东西,我会抛弃该代码并使用更直接的东西。像下面这样的东西可能会这样做。
function genCode () {
$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
$returnValue = '';
for ($i = 0; $i < 20; $i++) {
$returnValue .= $chars[mt_rand(0, 35)];
}
return $returnValue;
}
如果需要,您可以对返回值进行散列,但我不知道除了混淆用于提出随机字符串的方案之外还有什么意义。