多数の一意のキーを生成する必要があります。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 個のキーを生成しても重複はありません。