2008-10-08 14 views
15

Ich versuche, eine eindeutige ID in PHP zu generieren, um von Benutzern hochgeladene Inhalte auf einem FS ohne Konflikte zu speichern. Ich bin mit PHP, und im Moment dieser kleine Schnipsel ist verantwortlich für die Erzeugung der UID:Generieren einer eindeutigen ID in PHP

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

Dieser Code ist scheußlich: es eine temporäre Datei auf dem FS erstellt und löscht es, nur den entsprechenden eindeutigen Halteteil der generierten Zeichenfolge.

Gibt es einen besseren Weg dies zu tun, am besten ohne externe Abhängigkeiten?

Vielen Dank!

Antwort

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

Ruft eine vorangestellte eindeutige Kennung basierend auf der aktuellen Zeit in Mikrosekunden ab.

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

würde es nicht Hash mit MD5 tatsächlich machen es wahrscheinlicher, Kollisionen zu erzeugen? – nickf

+1

Ich wollte das gerade sagen. Sha1 hat weniger Kollisionen, aber dieses Problem gibt es definitiv beim Hashing. Denken Sie daran: Je länger Sie die eindeutige ID machen, und je öfter Sie etwas "zufällig" machen, desto geringer ist die Wahrscheinlichkeit einer Kollision. –

+0

Eigentlich sehe ich, Sie sind Punkt, Sie wollten eine ID nicht einen Token-Wert ... EDITED. –

5

uniqid() ist, was Sie in den meisten praktischen Situationen suchen.

Sie können es noch mehr "uniq" machen, indem Sie eine große Zufallszahl hinzufügen.

9

Da sowohl uniqid() und rand() Funktionen auf der aktuellen Zeit basiert, rand() fügt fast keine Entropie, da die Zeit nur eine kleine Menge zwischen den jeweiligen Anrufe ändern.

Solange Sie die Option more_entropy verwenden, sollten Sie nie eine Kollision innerhalb eines einzelnen Servers haben. Wenn Sie Clustering verwenden, müssen Sie ein Präfix angeben, das sich von Server zu Server unterscheidet.