Moin Moin!
UUID kannte ich nicht ... aber genau das löst mein Problem.
Vorsicht: Es gibt aktuell fünf verschiedene UUID-Typen, die sehr unterschiedliche Eigenschaften haben.
Version 1 bastelt aus MAC-Adresse und einer möglichst hoch auflösenden Uhr IDs. Hat die Uhr Probleme (Vorgehen / Nachgehen + Nachstellen, fehlende Uhr-Hardware), sind die IDs nicht mehr garantiert eindeutig. Außerdem läßt sich aus diesem UUID-Typ die Erstellungszeit und der Rechner bestimmen, was typischerweise nicht gewollt ist.
Version 2 ersetzt ein paar Bytes in der Zeitangabe der Version 1 durch mehr oder weniger konstante Werte (User-ID, Group-ID). Damit lecken diese Informationen auch noch heraus, außerdem läuft der Timer früher über als in Version 1.
Version 3 nutzt MD5-Summen von irgendwelchen Identifiern, ist also alles andere als zufällig. MD5 hat, wie jede andere Hash-Funktion auch, Kollisionen, d.h. es ist nicht ausgeschlossen, dass zwei Identifier die selbe UUID haben.
Version 4 nutzt einen Zufallsgenerator. Ob so generierte UUIDs eindeutig sind, hängt damit ausschließlich von der Qualität des Zufallsgenerators ab. Pseudo Random Number Generators, also das Erzeugen von pseudo-zufälligen Zahlen rein in Software, kann problematisch werden. Der PRNG in Turbo Pascal hatte deutlich unter 100.000 mögliche Werte (15 Bit oder 16 Bit). Modernere PRNGs liefern mehr Bits, aber 120 Bit sind eher selten und vor allem selten einzigartig. Auch Hardware-RNGs liefern keine EINZIGARTIGEN Werte, sondern ZUFÄLLIGE Werte. Ein RNG, egal ob Hardware oder Software, darf jeden Wert beliebig oft, auch mehrfach direkt nacheinander liefern. Damit könnte der RNG letztlich mehrfach die selbe UUID liefern.
Version 5 ist identisch mit Version 3, außer das statt MD5 SHA-1 benutzt wird.
Das UUIDs überhaupt funktionieren, liegt daran, dass der Wertebereich so astronomisch groß (2^128 ist etwa 3*10^38) ist, dass Kollisionen meistens unwahrscheinlich sind. Aber sie sind eben nicht AUSGESCHLOSSEN.
Sequenzen in gängigen RDBMS (wie z.B. PostgreSQL und Oracle) dagegen sind GARANTIERT eindeutig, so lange niemand an den Sequenz-Parametern herumadministriert. Oracle liefert pro Sequenz bis zu 10^28 Werte, PostgreSQL bis zu 2^64 (ca. 1,8*10^19) Werte. Das ist zwar deutlich weniger als der UUID-Wertebereich, aber immer noch deutlich mehr, als die meisten Anwendungen je benötigen werden.
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".