2008-10-08 16 views
15

Próbuję wygenerować unikatowy identyfikator w php, aby przechowywać treści przesłane przez użytkownika na serwerze FS bez konfliktów. Używam PHP, a w tej chwili ten mały urywek jest odpowiedzialny za generowanie UID:Generowanie unikalnego identyfikatora w PHP

$id = tempnam (".", ""); 
unlink($id); 
$id = substr($id, 2); 

Ten kod jest ohydny: tworzy plik tymczasowy na FS i usuwa go, zachowując tylko istotne wyjątkową rolę wygenerowanego ciągu.

Czy istnieje lepszy sposób, aby to zrobić, najlepiej bez żadnych zewnętrznych zależności?

Wielkie dzięki!

Odpowiedz

18
string uniqid ([ string $prefix [, bool $more_entropy ]]) 

Otrzymuje prefiksowany unikatowy identyfikator na podstawie bieżącego czasu w mikrosekundach.

USAGE: $id = uniqid(rand(), true); 
+0

nie sparowałaby go z MD5 w rzeczywistości zwiększa prawdopodobieństwo kolizji? – nickf

+1

Już miałem to powiedzieć. Sha1 ma mniej kolizji, ale na pewno jest to problem z hashowaniem. Pamiętaj: im dłużej stworzysz unikalny identyfikator i im więcej razy zrobisz coś "losowego", tym mniejsze prawdopodobieństwo kolizji. –

+0

Właściwie, widzę, że masz rację, potrzebujesz ID, a nie wartości tokena ... EDYCJA. –

5

Uniqid() jest tym, czego szukasz w większości praktycznych sytuacji.

Możesz zrobić jeszcze więcej "uniq", dodając po nim dużą liczbę losową.

9

Ponieważ zarówno uniqid() i rand() są funkcje oparte na obecnym czasie, rand() dodaje prawie żadnej entropii, ponieważ czas będzie zmienić tylko niewielką ilość pomiędzy odpowiednimi połączeniami.

Dopóki używasz opcji more_entropy, nigdy nie powinieneś mieć kolizji na jednym serwerze. Jeśli używasz klastrowania, pamiętaj, aby dołączyć prefiks, który różni się między serwerami.

Powiązane problemy