[PHP] Jak wygenerować niepowtarzalny identyfikator użytkownika?
Chcesz uzyskać unikalny identyfikator w postaci łańcucha znaków, który nie może się nigdy powtórzyć. Przydaje się często jako identyfikator sesji, klucz w bazie danych lub unikalny kod np. do odebrania kartki z życzeniami.
Unikalny identyfikator można wygenerować na wiele sposób, ale najbezpieczniej jest skorzystać z następującej konstrukcji:
<?
srand((double)microtime()*1000000);
$id = md5(uniqid(rand()));
echo $id;
?>
W wyniku otrzymasz 32 zupełnie przypadkowe znaki, np.
0ac2a496294d03d43b04f2783337d32c
Pierwsza linijka kodu inicjuje generator liczb losowych. Liczby losowe będą nam potrzebna do wygenerowania przypadkowego łańcucha znaków.
Teraz budujemy wyrażenie, którego celem jest stworzenie niepowtarzalnego ciągu znaków. Sama funkcja uniqid("") generuje niepowtarzalny ciąg znaków, jednak istnieje prawdopodobieństwo, że dwie osoby na dwóch różnych komputerach (gdy nasz system składa się z wielu maszyn) mogą wygenerować w tej samej mikrosekundzie ten sam ciąg znaków.
Dla bezpieczeństwa dodana została funkcja rand() generująca dodatkową, przypadkową liczbę. Teraz nasz identyfikator składa się z dwóch ciągów: - przypadkowej liczby i unikalnego łańcucha znaków. Całość została "potraktowana" jeszcze funkcją mieszającą md5(), która jest 128 bitowym znacznikiem bazującym na podanym ciągu znaków co dodatkowo gwarantuje kolejną niepowtarzalność znaków.
Podany przykład jest bardzo mocny i uzyskanie dwóch identycznych ciągów znaków jest praktycznie niemożliwe.
Do prostych zastosowań w zupełności wystarczy funkcja uniqid("") generująca identyfikator zależny od czasu systemowego.
<?
$id = uniqid("");
echo $id;
?>