2012-09-13 3 views
1

많은 수의 고유 키를 생성해야합니다. 하나의 키는 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 개의 키를 생성 할 때도 중복이 없습니다.

+2

cd 키 란 무엇입니까? 그리고 기존의 UUID/GUID 생성기를 사용하는 것은 어떨까요? – Evert

+0

@Evert, 16 자리 숫자의 키를 생성하고 싶습니다. 32 자리 16 진수는 내 요구에 상당히 큽니다. –

+0

코드를 테스트했는데 여기에는 중복 된 것이 없습니다 .. PHP 5.3.6 – dbf

답변

0

이것은 srand의 동작과 관련이있을 수 있습니다. 중복을 검사 할 때 모든 10000 키에 대해 한 번만 srand를 실행합니다. 아마 srand 만 ~ 2^13 개의 키를 생산할 수 있을까요? 어떤 PHP 버전을 사용하고 있습니까? 4.2.0 srand는 더 이상 필요하지 않지만 어쨌든 호출하면 나머지 스크립트에 대해서는 자동으로 중지됩니다.

1

거기에 일부 uniquid()를 던져주세요.

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

+0

감사하지만 16 자리 숫자의 키를 생성하고 싶습니다. –

+0

그래서 "그냥 사용"대신 "던져 넣기"와 같았습니다. 'function getFourDigits() {return substr (uniquid(), 0, 4)} ... ... 그와 같은 것 –

+0

uniqid()는 내 요구에 적합하지 않습니다. 문자와 숫자를 반환합니다. –