könnte es wiederholen? weil Guid niemals wiederholen wird
Engel
4
@angel Ja, es ist theoretisch möglich, dass die UUID.randomUUIDMethode ein Duplikat zurückgibt , aber dies ist überhaupt kein realistisches Problem . Die Oracle / OpenJDK-Implementierung verwendet einen kryptografisch starken Zufallszahlengenerator. Angesichts dessen und angesichts der astronomischen Reichweite, die durch so viele Bits in einer UUID gegeben ist, können Sie viele Millionen solcher Werte in Ihrer App generieren und trotzdem gut schlafen. Die Verwendung einer der anderen Varianten reduziert die Möglichkeit von Kollisionen weiter, die näher an Null liegen, da "Raum und Zeit", [1] MAC-Adresse oder -Name und [2] aktuelle Datums- und Uhrzeitzeit als Einschränkungen verwendet werden.
Basil Bourque
@RenniePet Eh, wenn Sie so paranoid sind und beim Erstellen einer neuen ID Zugriff auf die Liste der bereits verwendeten IDs haben, generieren Sie einfach neue in a, whilebis Sie eine erhalten, die nicht in Ihrer Liste enthalten ist: p
Nyerguds
2
Der Oracle-Krypto-Zufallszahlengenerator ist normalerweise ein PRNG mit einem zufälligen Startwert. Der zufällige Keim wird typischerweise unter Verwendung einer vom Betriebssystem bereitgestellten "Entropiequelle" erhalten. Wenn Sie diese Quelle verschlechtern oder gefährden können, erhöht sich die Wahrscheinlichkeit, dass ein Krypto-Zufallszahlengenerator dieselbe Zahl erzeugt. Es ist auch erwähnenswert, dass auf einigen (z. B. virtualisierten) Plattformen dem Betriebssystem die Entropie ausgehen kann. Es gibt "zwielichtige Hacks", um dies zu umgehen, aber sie führen zu einer Verschlechterung der Qualität der Entropie.
Stephen C
Dies ist nicht nur ein akademisches Anliegen. Ich habe eine (gesehen ungeprüfte !! ) behauptet , dass jemand hat Probleme mit zufallsbasierten UUIDs nicht eindeutig zu sein.
Stephen C
32
Es hängt davon ab, welche Art von UUID Sie möchten.
Die Standard-Java- UUIDKlasse generiert UUIDs der Version 4 (zufällig). ( UPDATE - Version 3 (Name) UUIDs können ebenfalls generiert werden.) Es können auch andere Varianten verarbeitet werden, obwohl sie nicht generiert werden können. (In diesem Fall wird „handle“ Mittel - Konstrukt UUIDInstanzen aus long, byte[]oder StringDarstellungen, und bieten einige geeignete Accessoren.)
Die Java UUID Generator (JUG) -Implementierung gibt vor, "alle 3" offiziellen "UUID-Typen gemäß RFC-4122 zu unterstützen ... obwohl der RFC tatsächlich 4 Typen definiert und einen fünften Typ erwähnt.
Weitere Informationen zu UUID-Typen und -Varianten finden Sie in Wikipedia in einer guten Zusammenfassung. Die wichtigsten Details finden Sie in RFC 4122 und den anderen Spezifikationen.
Nicht ganz richtig, es kann auch UUID.nameUUIDFromBytes(byte[] name)
namenbasierte
Ich stehe korrigiert. Ich habe mich auf die Javadoc-Beschreibung verlassen, die besagt: "Statische Factory, um eine UUID vom Typ 3 (
Stephen C
Ich denke nicht, dass der Beitrag korrekt ist. In den UUID-Java-Dokumenten wird angegeben, dass der Konstruktor eine nicht zufällige Typ-2-Variante generiert. Für Typ 3 verwenden public static UUID nameUUIDFromBytes(byte[] name). für Typ 4 verwenden public static UUID randomUUID(). Typ 1 ist mit der JDK-Klasse nicht verfügbar.
Slartibartfast
Ich glaube, ich habe es ziemlich richtig verstanden. In den Javadocs heißt es: "Obwohl die Konstruktoren die Erstellung einer beliebigen UUID-Variante erlauben ( siehe unten)." und 4 Varianten sind unten aufgeführt, einschließlich Typ 1. In der Tat lesen Sie das Javadoc fürclockSequence()
Stephen C
27
Nur um Mark Byers 'Antwort mit einem Beispiel zu erweitern:
Wenn Sie andere Versionen von UUIDs wünschen, können Sie Ihre Java-App außerhalb der JVM erreichen , um UUIDs zu generieren, indem Sie Folgendes aufrufen:
Befehlszeilenprogramm Mit fast jedem Betriebssystem gebündelt. Zum Beispiel,uuidgen in Mac OS X, BSD und Linux.
Datenbankserver Verwenden Sie JDBC , um eine auf dem Datenbankserver generierte UUID abzurufen. Beispielsweise wird die uuid-osspErweiterung häufig mit Postgres gebündelt . Diese Erweiterung kann Werte der Versionen 1, 3 und 4 sowie einige Variationen generieren:
uuid_generate_v1mc() - generiert eine UUID der Version 1, verwendet jedoch eine zufällige Multicast-MAC-Adresse anstelle der tatsächlichen MAC-Adresse des Computers.
uuid_generate_v5(namespace uuid, name text) - generiert eine UUID der Version 5, die wie eine UUID der Version 3 funktioniert, außer dass SHA-1 als Hashing-Methode verwendet wird.
Ich habe einige Probleme mit Ihrer Antwort: Erstens hat sich bereits gezeigt, dass es falsch ist, dass Sie nur V4 aus der Standard-Java-Bibliothek erhalten können (V3 ist ebenfalls möglich). Zweitens klingt es so, als gäbe es in Java außer der Standardbibliothek keine Optionen, zusammen mit einer Handwelligkeit "aus Sicherheitsgründen". Und schließlich ist es im Allgemeinen ineffizient (programmierungs- und / oder leistungsmäßig), abhängig von externen Quellen zu beginnen, wenn es viele Möglichkeiten gibt, dies in Java zu tun (es sei denn, Sie benötigen es in diesen, z. B. als Teil der Erstellung eines Datensatz im SQL Server).
Antworten:
Schauen Sie sich die mit Java 5 und höher gebündelte UUID-Klasse an .
Zum Beispiel:
quelle
java.util.UUID.randomUUID();
quelle
UUID.randomUUID
Methode ein Duplikat zurückgibt , aber dies ist überhaupt kein realistisches Problem . Die Oracle / OpenJDK-Implementierung verwendet einen kryptografisch starken Zufallszahlengenerator. Angesichts dessen und angesichts der astronomischen Reichweite, die durch so viele Bits in einer UUID gegeben ist, können Sie viele Millionen solcher Werte in Ihrer App generieren und trotzdem gut schlafen. Die Verwendung einer der anderen Varianten reduziert die Möglichkeit von Kollisionen weiter, die näher an Null liegen, da "Raum und Zeit", [1] MAC-Adresse oder -Name und [2] aktuelle Datums- und Uhrzeitzeit als Einschränkungen verwendet werden.while
bis Sie eine erhalten, die nicht in Ihrer Liste enthalten ist: pEs hängt davon ab, welche Art von UUID Sie möchten.
Die Standard-Java-
UUID
Klasse generiert UUIDs der Version 4 (zufällig). ( UPDATE - Version 3 (Name) UUIDs können ebenfalls generiert werden.) Es können auch andere Varianten verarbeitet werden, obwohl sie nicht generiert werden können. (In diesem Fall wird „handle“ Mittel - KonstruktUUID
Instanzen auslong
,byte[]
oderString
Darstellungen, und bieten einige geeignete Accessoren.)Die Java UUID Generator (JUG) -Implementierung gibt vor, "alle 3" offiziellen "UUID-Typen gemäß RFC-4122 zu unterstützen ... obwohl der RFC tatsächlich 4 Typen definiert und einen fünften Typ erwähnt.
Weitere Informationen zu UUID-Typen und -Varianten finden Sie in Wikipedia in einer guten Zusammenfassung. Die wichtigsten Details finden Sie in RFC 4122 und den anderen Spezifikationen.
quelle
UUID.nameUUIDFromBytes(byte[] name)
public static UUID nameUUIDFromBytes(byte[] name)
. für Typ 4 verwendenpublic static UUID randomUUID()
. Typ 1 ist mit der JDK-Klasse nicht verfügbar.clockSequence()
Nur um Mark Byers 'Antwort mit einem Beispiel zu erweitern:
quelle
Die anderen Antworten sind richtig, vor allem dieses von Stephen C .
Außerhalb von Java erreichen
Das Generieren eines UUID- Werts in Java ist auf Version 4 beschränkt (zufällig). aus Sicherheitsgründen .
Wenn Sie andere Versionen von UUIDs wünschen, können Sie Ihre Java-App außerhalb der JVM erreichen , um UUIDs zu generieren, indem Sie Folgendes aufrufen:
Mit fast jedem Betriebssystem gebündelt.
Zum Beispiel,
uuidgen
in Mac OS X, BSD und Linux.Verwenden Sie JDBC , um eine auf dem Datenbankserver generierte UUID abzurufen.
Beispielsweise wird die
uuid-ossp
Erweiterung häufig mit Postgres gebündelt . Diese Erweiterung kann Werte der Versionen 1, 3 und 4 sowie einige Variationen generieren:uuid_generate_v1mc()
- generiert eine UUID der Version 1, verwendet jedoch eine zufällige Multicast-MAC-Adresse anstelle der tatsächlichen MAC-Adresse des Computers.uuid_generate_v5(namespace uuid, name text)
- generiert eine UUID der Version 5, die wie eine UUID der Version 3 funktioniert, außer dass SHA-1 als Hashing-Methode verwendet wird.Beispielsweise erstellt der UUID-Generator die Versionen 1 und 3 sowie Nullwerte und GUID .
quelle