生成数千个独特且不可预测的序列号。

3

嗨,我想生成数千个独特的、不可预测的序列号,因此我编写了这个函数

function generate_serials($count){
    $serials = array();
    $token = '8uhf7+-=??/\/';

    for($i = 1; $i <= $count; $i++){
        $hash = sha1(md5( $token . ( time() + (432 * 1000) ) ));
        $serial = '';
        for($j = 0; $j < 12; $j++){
            if($j == 4 || $j == 8) $serial .= '-';
            $serial .= $hash[rand(0, 39)];
            if(in_array($serial, $serials)){
                $serial = '';
                $j = 0;
            }
        }
        $serials[] = $serial;
    }
    return $serials;
}

我有几个关于这种方法的问题。

  1. 我不知道为什么,但我不相信这个方法。(因为我总觉得我的解决方案和我自己都很蠢) 这个方法有什么问题吗?

  2. 另一个问题是性能,它需要大约20-30秒,这是正常的吗,还是我弄错了?

更新

哦,对不起大家 性能问题是因为内部循环计数器的名称与外部循环相同..是我的错误! :D


1
只需使用http://php.net/manual/zh/function.uniqid.php。 - Dunhamzzz
1
@Dunhamzzz,你有看到你链接的页面上的大黄色提示吗? - Fabian Schmengler
它会比你的函数更随机,因为它基于微秒级别,而且速度更快。 - Dunhamzzz
1个回答

3
你的解决方案过于复杂了。其实可以更简单。如果你已经安装了 OpenSSL,可以尝试使用 openssl_random_pseudo_bytes
或者你可以这样使用 mt_randhash
$serial = hash('sha512', mt_rand());

然而,mt_rand并不能生成具有密码学安全性的值,因此它可能不像您希望的那样不可预测。


不仅过于复杂,而且大部分的过度复杂并没有增加任何安全性。像那样的自制解决方案不值得信任是正确的。 - Fabian Schmengler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接