2014-11-12 6 views
4

PHP의 uniqid()는 마이크로 초 단위의 현재 타임 스탬프를 기반으로 고유 한 ID를 생성합니다. 고유 한 ID를 생성하는 것은 정말로 간단한 방법입니까?마이크로 초 단위의 타임 스탬프는 항상 고유합니까?

심지어 단일 사용자가 마이크로 초 단위로 타임 스탬프를 생성하는 루프가있는 단일 스크립트를 실행한다고 가정해도 여전히 이론적 인 보장이있을 수 있습니까? 실제로, 그 가능성은 완전히 무시할 수 있습니까? 명확성을 위해

, 루프이 불과하다 말 :

foreach($things as $thing){ 
    var_dump(microtime()); 
} 

그렇게한다면, 그것은 실제로 어떻게 현실, 고유하지 수있는 이론적 가능성이?

+2

얼마나 빨리 루프가 진행되는지에 따라 다릅니다. –

답변

6

마이크로 초 기반 ID는 한도 내에서만 유일 함을 보장합니다. 단일 컴퓨터에서 단일 스레드 스크립트는이 점에서 아마도 매우 안전 할 것입니다. 그러나 병렬 실행에 대해 이야기하기 시작하자마자 동일한 시스템 내의 여러 CPU 또는 여러 대의 시스템에서 간단히 말해 모든 베팅이 해제됩니다.

그래서이 ID를 사용하려는 대상에 따라 다릅니다. 동일한 스크립트에서만 사용되는 ID를 생성하는 데 방금 사용하는 경우 충분히 안전 할 것입니다. 예를 들면 다음과 같습니다.

<?php $randomId = uniqid(); ?> 
<div id="<?php echo $randomId; ?>"></div> 
<script> 
    var div = document.getElementById('<?php echo $randomId; ?>'); 
    ... 
</script> 

여기에는 제한된 사용으로 인해 문제가 발생하지 않을 가능성이 높습니다.

그러나 uniqid을 사용하여 파일 이름을 생성하거나 다른 외부 스크립트와 공유하는 다른 용도로 사용하는 경우에는 사용하지 않을 것입니다. 파일 이름의 경우 파일 내용을 기반으로 해시를 사용하는 것이 좋습니다. 일반적으로 분산 된 무작위로 생성 된 ID의 경우 UUIDs이 적합합니다 (이러한 용도로 설계 되었기 때문에).

+0

나는 그것을 즉시 사용할 필요가 없다. 단지 호기심이었을 뿐이다. 정교한 답변과 UUID에 대한 기사 링크에 감사드립니다. – vanamerongen

0

왜 처음에는 uniqid가 필요한지 자문 해보십시오. 예를 들어, 내 웹 사이트에 업로드 파일 이름으로 uniquid를 사용합니다. 동시에 업로드 할 수있는 사용자가 많을 수 있으므로 동일한 ID를 가진 두 개 이상의 파일이 걱정됩니다. 단 한 명의 사용자가 한 번에 하나의 파일 만 업로드 할 수 있다는 것을 알고 있습니다. 그래서, 나는 앞에 사용자 이름을 추가하고 항상 유일성을 가질 것이다.

echo uniqid('username-'); // username-5621e3335ac0c 

물론 처음에는 uniquid를 사용해야하는지 항상 자문 해 두어야합니다. id를 생성하는 이유를 알고 있다면 x 초, 분 등 매번 발생할 수 있습니다. 그런 다음 id를 사용하는 것과 같은 방식으로 시간을 사용하면됩니다.

echo 'username-'.time(); // username-1445062025 
관련 문제