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

4

1 回答 1

3

您的解决方案过于复杂。不一定要那样。如果您安装了 OpenSSL,请查看openssl_random_pseudo_bytes

mt_rand或者,您可以hash像这样使用:

$serial = hash('sha512', mt_rand());

但是mt_rand不会生成加密安全值,因此它可能不像您希望的那样不可预测。

于 2013-02-26T11:48:48.743 回答