Die UUID

IDs kommen beim Programmieren an jeder Ecke vor, sei es in einer Datenbank zur eindeutigen Identifizierung eines Datensatzes, als SessionID zur Identifizierung eines Besuchers oder auch als MessageID in einer Mail. Jeder kennt sie aber auch in Form von Telefon- und Hausnummern, um nur ein paar Beispiele zu nennen.

Der Identifier soll ein Objekt eindeutig bestimmen. In einem geschlossenem System wie einer Datenbank-Tabelle ist das leicht mit der Felddefinition ‚Primärschlüssel‘ und ‚auto_increment‘ herzustellen. In komplexeren Situationen muss die ID per Software generiert werden und man muss, wenn man exakt arbeitet, die Eindeutigkeit per Überprüfung sicherstellen.

Nur kann und will man das immer? Bei einer MessageID in einer Mail ist es unmöglich zu überprüfen, ob diese ID weltweit überhaupt schonmal vergeben wurde, bei einem AJAX-Request, wo man zur Absicherung von Datendiebstahl nur ganz kurze Zeit eine ID braucht, will man nicht den aufwendigen Weg der Verifikation gehen – belastet das System unnötig und nimmt Zeit in Anspruch.

Der klassische Weg sich eine ID zu ‚basteln‘ geschieht oft mit der md5-Funktion von PHP:

string md5 ( string $str [, bool $raw_output= false ] )

Als String übergibt man Werte, die mehr oder weniger zufällig sind, wie beispielsweise die Zeit, beliebt ist auch die Einbindung der IP. Das Ganze sieht dann so aus:

Als Resultat bekommt man einen 32 Zeichen langen Hexadezimalwert zurück:

adb34e9a1f78d457eb41b30de9e7e880

Sieht beeindruckend aus, hat aber ein paar Nachteile: Der md5-Hash ist reproduzierbar, ein gleicher String erzeugt auch denselben Ausgabewert, die Güte der ID hängt von der Qualität, der Einzigartigkeit des übergebenden Strings ab. Die Client-IP eines Users ist nicht zwangsläufig einzigartig, ein Proxy kann das sinnvoll verhindern. Die Zeit ist auch nur begrenzt einzigartig, man denke an Zeitzonen oder auch an Systeme von mehreren Rechnern mit derselben Zeiteinstellung. Man kann dem String noch eine Zufallszahl hinzufügen – okay, dann wird es schon ziemlich einzigartig.

Wesentlich besser und eleganter ist hier der Einsatz des ‚Universally Unique Identifier‘ (UUID), der so aussieht:

797e2bd0-664d-48a7-91b3-d72e8a2b3cd9

Die UUID ist ein 128bit langer hexadezimaler Wert, der in 5 Gruppen aufgeteilt ist und genau für ein solches Einsatzgebiet konzipiert wurde. Eine einfache Beschreibung der UUID gibt es bei Wikipedia und wer es ganz genau wissen will, kann im RFC4122 nachlesen wie sie aufgebaut ist und welche Typen es gibt.

Es gibt ein PECL-Package, das UUIDs erzeugen kann, allerdings erlaubt es nicht, Einfluss auf die Ausgabe, wie z.B. die UUID-Version zu nehmen.

Für besonders anspruchsvolle Situationen und Sicherheitsfanatiker gibt es bei shapeshifter.se einen UUID-Generator, der keine Wünsche offen lässt.

Ich selber halte diese Klasse in den meisten Fällen für völlig überdimensioniert und benutze die folgende Funktion für meine UUIDs. Die Funktion arbeitet sehr schnell und basiert auf Pseudo-Zufallszahlen.

Download, PHP