Wenn ich Long uuid = UUID.randomUUID().getMostSignificantBits()
verwende, wie wahrscheinlich ist es, eine Kollision zu bekommen. Es schneidet die niedrigstwertigen Bits ab, also besteht die Möglichkeit, dass es zu einer Kollision kommt, richtig?
Laut der Dokumentation erzeugt die statische Methode UUID.randomUUID()
eine UUID vom Typ 4.
Das bedeutet, dass sechs Bits für einige Typinformationen verwendet werden und die restlichen 122 Bits zufällig zugewiesen werden.
Die sechs nicht zufälligen Bits werden so verteilt, dass vier in der höchstwertigen Hälfte der UUID und zwei in der niedrigstwertigen Hälfte liegen. Die höchstwertige Hälfte Ihrer UUID enthält also 60 Bits an Zufälligkeit, was bedeutet, dass Sie im Durchschnitt 2^30 UUIDs generieren müssen, um eine Kollision zu erhalten (im Vergleich zu 2^61 für die vollständige UUID).
Ich würde also sagen, dass Sie ziemlich sicher sind. Beachten Sie jedoch, dass dies für andere Arten von UUIDs absolut nicht zutrifft, wie Carl Seleborg erwähnte.
Übrigens wären Sie etwas besser dran, wenn Sie die niedrigstwertige Hälfte der UUID verwenden würden (oder einfach eine zufällige Länge mit SecureRandom generieren).
Raymond Chen hat dazu einen wirklich hervorragenden Blogbeitrag verfasst:
GUIDs sind global eindeutig, aber Teilzeichenketten von GUIDs sind es nicht
Besser ist es, einfach einen langen Zufallswert zu erzeugen, dann sind alle Bits zufällig. In Java 6 verwendet new Random() die System.nanoTime() plus einen Zähler als Seed.
Es gibt verschiedene Stufen der Einzigartigkeit.
Wenn Sie die Eindeutigkeit auf vielen Rechnern benötigen, können Sie eine zentrale Datenbanktabelle für die Zuweisung eindeutiger IDs oder sogar Stapel eindeutiger IDs verwenden.
Wenn Sie nur in einer Anwendung Eindeutigkeit benötigen, können Sie einfach einen Zähler verwenden (oder einen Zähler, der mit currentTimeMillis()*1000 oder nanoTime() beginnt, je nach Ihren Anforderungen)