1

多数の一意のキーを生成する必要があります。1 つのキーは 16 桁で構成されている必要があります。次のコードを思いつきました:

function make_seed()
{
    list($usec, $sec) = explode(' ', microtime());
    return (float) $sec + ((float) $usec * 100000);
}
function generate_4_digits(){
    $randval = rand(100, 9999);
    if($randval < 1000){
        $randval = '0'.$randval;
    }
    return (string)$randval;
}
function generate_cdkey(){
    return generate_4_digits() . '-' . generate_4_digits() . '-' . generate_4_digits() . '-' . generate_4_digits();
}


srand(make_seed());
echo generate_cdkey();

結果は非常に有望6114-0461-7825-1604でした。次に、10 000 個のキーを生成し、取得した重複の数を確認することにしました。

srand(make_seed());
$keys = array();
$duplicates = array();
for($i = 0; $i < 10000; $i++){
    $new_key = generate_cdkey();
    if(in_array($new_key, $keys)){
        $duplicates[] = $new_key;
    }
    $keys[] = $new_key;
}
$keys_length = count($keys);
var_dump($duplicates);
echo '<pre>';
for($i = 0; $i < $keys_length; $i++){
    echo $keys[$i] . "\n";
}
echo '</pre>';

最初の実行1807では、かなりがっかりした重複がありました。しかし、次の各実行での私の大きな驚きには、同じ数の重複が得られます!? 生成されたキーをよく見ると、最後の1807キーが最初のキーとまったく同じであることがわかりました。だから私は8193単一の複製なしで生成できますか?! これは 2^13 に近い!? rand()は maz 2^13 の一意の番号を生成するのに適していると結論付けることができますか? しかし、なぜ?

使用するコードを変更したところ、mt_rand()50,000 個のキーを生成しても重複はありません。

4

3 に答える 3

1

そこにいくつかのuniquid()を投げます。

http://www.php.net/manual/en/function.uniqid.php

于 2012-09-13T22:04:01.813 に答える
1

これはおそらくあなたが探しているものです。openssl_random_pseudo_bytes(int $ length [、bool&$ crypto_strong])

于 2012-09-13T22:06:13.323 に答える
0

これは、srand の動作に関係している可能性があります。重複をチェックするときは、10000 個のキーすべてに対して srand を 1 回だけ実行しています。おそらく、srand は ~2^13 個のキーに十分な量しか生成しないのでしょうか? どのPHPバージョンを使用していますか? 4.2.0 から srand はもう必要ありませんが、とにかくそれを呼び出すと、スクリプトの残りの部分で自動的に停止します。

于 2012-09-13T21:58:12.193 に答える