2011-11-27 3 views
1

PHP에서는 고유 번호를 생성 할 때 항상 확신 할 수 없습니다.고유성 :`time()`Vs`mt_rand()`

time()mt_rand()보다 고유합니까?

time()은 시간이 두 번 반복 될 수 없기 때문에 나에게 고유 한 것처럼 보입니다.

mt_rand() PHP의 기본 정수가 제공하는 고유 한 정수에 대해 확실하지 않습니다. 고유 한 정수가 시간에 따라 반복됩니까?

+2

선택 사항은이 숫자를 사용하려는 용도에 따라 달라집니다. – deceze

+0

MySQL에서 페이지 또는 제품 ID를 만들 수있는 'AUTO_INCREMENT'처럼 사용하고 싶습니다. 동일한 정보를 공유하는 두 개의 테이블을 가지고 있기 때문에 'AUTO_INCREMENT'를 ID 고유성으로 사용할 수 없습니다. – laukok

+1

테이블 중 하나에서'AUTO_INCREMENT'을 사용할 수없고 다른 테이블에 대해 생성 된 ID를 사용할 수 없습니까? mysql_insert_id가 도움이 될 수있다. – poke

답변

2

uniqid()을 고려해 보셨나요?

또한 실제 질문에 답하면 : time()과는 달리 mt_rand는 결국 숫자를 반복합니다. 그러나 고유하게하려면 초당 한 번만 time()을 사용할 수 있습니다.

+0

예하지만 uniqid는 다음과 같습니다. 4b3403665fea6에 알파벳이 포함되어 있습니다 ... 정수 만 원합니다. 감사. – laukok

+0

자, 여러분은'base_convert'를 다음과 같이 사용할 수 있습니다 :'base_convert (uniqid(), 16,10)'이것은 고유 한 int가 될 것입니다 –

+0

오, 저는 int가 매우 높다는 코멘트에 덧붙이고 싶습니다. 32 비트 시스템을 사용하고 있다면'uniqid()'에서 처음 2 바이트를'substr()'하는 것이 좋다. –

2

많은 사용자가 time()을 동시에 사용하는 경우 동일한 초에 두 개의 이벤트가 발생하여 time()mt_rand()처럼 고유하지 않을 수 있습니다. mt_rand()을 사용하면 거의이라는 결과가 보장되지만 그렇지 않을 수도 있습니다.

또 다른 방법은 이벤트가 같은 마이크로에서 발생하는에 대한 특별한 것이 당신에게 독특한 스탬프를 줄 것이다 마이크로 현재 시간을 반환 microtime()을 사용하는 것입니다. 또한 대부분 내부적으로 microtime()를 사용하여 마이크로 현재 시간 (에서 ID를 생성 uniqid()을 고려할 수

1

시간 (사용) 고유 ID를위한 좋은 아이디어는 보통 아닌, 몇 가지 이유 :.

    당신이이
  1. 그것은 중요하지 않을 수 있습니다 정확히 같은 2 개 연속 ID를 얻을 수 있도록
  2. 다른 OS는 서로 다른 시간 해상도를 가질 수 있지만, 시간
+0

모든 '임의의'숫자는 현재 시간을 기준으로합니다. 그래서 임의성은 존재하지 않으며 모든 임의성은 실제로 의사 임의성입니다. 그러나 매우 사실! +1 – Rudie

+0

모든 랜덤 제너레이터가 시간에 기반한 것은 아니지만 (대부분은 그렇지만), 일부는 온도를 기반으로하며 드문 경우 인 - 양자 터널링입니다. 그러나 더 중요한 것은, 수학적으로 서로 추론하기가 더 어렵다는 점입니다. 이것이 실제 요점입니다. – idanzalz

+0

온도 =) Kewl! 그걸 몰랐어. – Rudie

2

mt_을 기반으로 ID를 추측하기 상당히 쉽다 rand는 동일한 값을 두 번 생성 할 수 있지만 그 확률은 시간이 유닉스 시대 이후 초를 반환하고 두 번 반복 될 수 없다고 생각할 수 있습니다. 그러나 1 초마다 두 번 이상 호출 될 경우 mt_rand가 다른 값을 반환하는 동일한 결과를 반환한다는 것을 의미하는 매 초마다 변경됩니다.