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. もう1つの問題は、パフォーマンスに約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 に答える