많은 수의 고유 키를 생성해야합니다. 하나의 키는 16 자리로 구성되어야합니다. 다음 코드를 내놓았다 :rand()와 하나의 시드가있는 임의의 숫자
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
매우 유망한했다. 첫 번째 실행에
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
중복을 가지고 : 은 그 때 나는 10 000 키를 생성하고 내가 얼마나 많은 중복보기로 결정했다. 그러나 각 다음 실행에 대한 나의 위대한 놀람을 위해 나는 중복의 동일한 수를 얻는다!? 생성 된 키를 면밀히 살펴보면, 마지막 1807
키가 첫 번째 키와 정확히 동일하다는 것을 알았습니다. 그래서 하나의 복제본없이 8193
을 생성 할 수 있습니까?! 이것은 2^13에 아주 가깝습니까?! 우리는 rand()
이 maz 2^13 고유 번호를 생성하는 데 적합하다고 결론 지을 수 있습니까? 하지만 왜?
mt_rand()
을 사용하도록 코드를 변경했으며 50 000 개의 키를 생성 할 때도 중복이 없습니다.
cd 키 란 무엇입니까? 그리고 기존의 UUID/GUID 생성기를 사용하는 것은 어떨까요? – Evert
@Evert, 16 자리 숫자의 키를 생성하고 싶습니다. 32 자리 16 진수는 내 요구에 상당히 큽니다. –
코드를 테스트했는데 여기에는 중복 된 것이 없습니다 .. PHP 5.3.6 – dbf