Unique ID generieren - mehrere Server

onkelyves

Mitglied
Was ist die beste möglichkeit UniqueIDs zu generieren? Insbesondere, wenn die Anwendungen auf mehreren Servern parallel laufen soll?

Wie unique ist die Funktion uniqid wirklich? Die PHP-Dokumentation ist da nicht ganz eindeutig.
Gibt eine eindeutige ID mit Präfix zurück, die auf der aktuellen Zeit in Mikrosekunden basiert.
Ich benötige nicht unbedingt cryptographisch sichere IDs, hauptsache, die sind wirklich unique.
Im moment benutze ich folgendes:
PHP:
$myuniqueid = __SERVERID__ . uniqid();
Kann ich da zu 100% sicher sein, dass es da zu keinen Kollisionen kommt? Bis jetzt ist es noch nicht vorgekommen nur ich will die Möglichkeit zu 100% ausschließen. Wie sieht das aus, wenn mehrere Prozesse nenbeneinander auf mehreren Cores laufen? Berücksichtigt PHP das?
Wie sieht das bei Zeitumstellung / Korrektur aus?

Danke schonmal für Antworten.
 
Hi, danke für die Antwort.
Du sagst, dass ich dann 'ne Wahrscheinlichkeit von 1:1000000 habe, dass die IDs gleich sind. Heißt, wenn da 3 Mio Requests pro Tag laufen klingelt bei mir dreimal das Telefon wegen 'nem nicht zuordnenbaren Fehler. Da hab ich keine Lust drauf :)
Also __SERVERID__ ist schon für jeden Server eindeutig, die ist nicht das Problem. Was aber, wenn ein Server mehrere Cores hat und dort mehrere Prozesse nebeneinander laufen. Das kann ja durchaus zur selben Microsekunde passieren, oder nicht? Dann kann es doch zu kollisionen kommen oder wird das von der Funktion berücksichtigt?
 
Hi!

100%ig sicher wird so nie möglich sein. Aber uniqid(); ist durchaus aureichend dokumentiert: für jede Sekunde gibt es eine Million neuer Kombinationen - pro __SERVERID__. Eine Sekunde ist recht kurz. Selbst wenn Du ein Mainframe mit über 64 Multi-Core CPUs laufen hast der mit 1000 Requests in der Sekunde belastet wird (wenn dem so sein sollte benutzt du bestimmt nicht PHP...) ist es sowas von unwahrscheinlich das sich die IDs doppeln - zumal bestimmt nicht jeder der Requests das Generieren einer solchen ID erfordert...
Wenn Dir das nicht reicht, schau dir doch mal die Argumente von uniqid(); an - und wenn's denn wirklich sein muss, probier mal das hier:
PHP:
$myuniqueid = __SERVERID__ .uniqid(rand(), true)

Gruß
Enum

PS: Mein (gelöschter) vorheriger Post war Bullshit. Ich hatte deinen Post nicht ganz verstanden... Und nein, mehrere Cores werden nicht von der Funktion berücksichtigt. Allerdings ist es noch viel viel unwahrscheinlicher, dass Deine Multi-Core CPU in zwei Kernen zu selben zeit das gleiche Kommando ausführt - zumal auf einem Server nicht nur PHP Aufgaben für den Prozessor hat.
 
Danke für die Antwort. Das letzte mit der erweiterten Entropie kommt für mich erstmal nicht in Frage, weil mir dann die ID zu lang wird.
Ich glaub dann nehm ich die Wahrscheinlichkeit in Kauf, dass es da bei mehreren Cores zu Kollisionen kommen könnte, zumal zusätzlich zu der ID noch 'ne 4 stellige Hexadezimal Zusatzkomponente dazu kommt.
Das wär ja dann bei 'nem Quadcore 'ne Wahrscheinlichkeit von 1 zu ein paar Milliarden, damit kann ich denke ich leben :-)
Sollte es doch mal zu einer Kollision kommen, werde ich hier berichten...
 
Zurück