JUG ist eine Reihe von Java-Klassen für die Arbeit mit UUIDs: Generieren von UUIDs mit beliebigen Standardmethoden, effiziente Ausgabe, Sortieren usw. Es generiert UUIDs gemäß der UUID-Spezifikation (RFC-4122) (weitere Erläuterungen finden Sie auf der Wikipedia-UUID-Seite).
JUG wurde ursprünglich 2002 von Tatu Saloranta ([email protected]) geschrieben und im Laufe der Jahre aktualisiert. Darüber hinaus haben viele andere Personen geholfen, Fehler zu beheben und neue Funktionen zu implementieren: Die vollständige Liste finden Sie in release-notes/CREDITS
.
JUG ist unter der Apache-Lizenz 2.0 lizenziert.
JUG unterstützt beide „klassischen“ Versionen, die in RFC 4122 definiert sind:
1
: zeit-/ortsbasiert3
und 5
: Namens-Hash-basiert4
: Zufallszahlenbasiertund neu (im Zeitraum 2022–2024) vorgeschlagene (siehe uuid6 und RFC-4122 bis) Varianten:
6
: neu geordnete Variante von Version 1
(mit lexikografischer Reihenfolge)7
: Unix-Zeitstempel + zufallsbasierte Variante (auch mit lexikografischer Reihenfolge) Typ | Status |
---|---|
Erstellen (CI) | |
Artefakt | |
OSS-Sponsoring | |
Javadocs | |
Codeabdeckung (5.x) | |
OpenSSF-Score |
JUG kann als Befehlszeilentool (über die Klasse com.fasterxml.uuid.Jug
) oder als steckbare Komponente verwendet werden.
Maven-Koordinaten sind:
< dependency >
< groupId >com.fasterxml.uuid</ groupId >
< artifactId >java-uuid-generator</ artifactId >
< version >5.1.0</ version >
</ dependency >
Gradle:
implementation ' com.fasterxml.uuid:java-uuid-generator:5.1.0 '
Die einzige Abhängigkeit für JUG ist die Protokollierungsbibliothek:
log4j
verwendet (Laufzeitabhängigkeit)slf4j
-API verwendet: Protokollierungsimplementierung, die von der aufrufenden Anwendung bereitgestellt werden muss Seit Version 3.2.0
definiert JUG JDK9+-kompatible module-info.class
mit dem Modulnamen com.fasterxml.uuid
.
Direkte Downloads finden Sie im Project Wiki.
Der ursprüngliche Anwendungsfall für JUG war die Generierung von UUID-Werten. Dazu wählen Sie zunächst einen zu verwendenden Generatortyp aus und rufen dann dessen Methode generate()
auf. Zum Beispiel:
UUID uuid = Generators . timeBasedGenerator (). generate (); // Version 1
UUID uuid = Generators . randomBasedGenerator (). generate (); // Version 4
UUID uuid = Generators . nameBasedgenerator (). generate ( "string to hash" ); // Version 5
// With JUG 4.1+: support for https://github.com/uuid6/uuid6-ietf-draft versions 6 and 7:
UUID uuid = Generators . timeBasedReorderedGenerator (). generate (); // Version 6
UUID uuid = Generators . timeBasedEpochGenerator (). generate (); // Version 7
// With JUG 5.0 added variation:
UUID uuid = Generators . timeBasedEpochRandomGenerator (). generate (); // Version 7 with per-call random values
Wenn Sie Generatoren anpassen möchten, möchten Sie möglicherweise auch nur die Generatorinstanz beibehalten:
TimeBasedGenerator gen = Generators . timeBasedGenerator ( EthernetAddress . fromInterface ());
UUID uuid = gen . generate ();
UUID anotherUuid = gen . generate ();
Wenn Ihr Computer über ein Standard-IP-Netzwerk-Setup verfügt, versucht die Factory-Methode Generators.defaultTimeBasedGenerator
(hinzugefügt in JUG 4.2) zu bestimmen, welche Netzwerkschnittstelle der Standardroute für den gesamten ausgehenden Netzwerkverkehr entspricht, und verwendet diese zum Erstellen eines zeitbasierten Generators. Dies ist wahrscheinlich eine gute Wahl für häufige Nutzungsszenarien, wenn Sie einen UUID-Generator der Version 1 benötigen.
TimeBasedGenerator gen = Generators . defaultTimeBasedGenerator ();
UUID uuid = gen . generate ();
UUID anotherUuid = gen . generate ();
Generatoren sind vollständig Thread-sicher, sodass eine einzelne Instanz von mehreren Threads gemeinsam genutzt werden kann.
Javadocs für weitere Informationen finden Sie im Projekt-Wiki.
java.util.UUID
-Werten in Byte[] Manchmal möchten Sie vielleicht von java.util.UUID
in eine externe Serialisierung konvertieren: zum Beispiel als String
s oder Byte-Arrays ( byte[]
). Die Konvertierung in String
ist mit UUID.toString()
(bereitgestellt von JDK) einfach, es gibt jedoch keine ähnliche Funktionalität für die Konvertierung in byte[]
.
UUIDUtil
Klasse bietet jedoch Methoden für effiziente Konvertierungen:
byte[] asBytes = UUIDUtil.asByteArray(uuid);
// or if you have longer buffer already
byte[] outputBuffer = new byte[1000];
// append at position #100
UUIDUtil.toByteArray(uuid, outputBuffer, 100);
java.util.UUID
Werten aus String, Byte[] UUID
Werte werden oft als Java String
oder byte[]
s (Byte-Arrays) übergeben und müssen konvertiert werden, um zu tatsächlichen java.util.UUID
Instanzen zu gelangen. JUG verfügt über optimierte Konvertierungsfunktionen, die über die Klasse UUIDUtil
(Paket com.fasterxml.uuid.impl
) verfügbar sind und wie folgt verwendet werden:
UUID uuidFromStr = UUIDUtil.uuid("ebb8e8fe-b1b1-11d7-8adb-00b0d078fa18");
byte[] rawUuidBytes = ...; // byte array with 16 bytes
UUID uuidFromBytes = UUIDUtil.uuid(rawUuidBytes)
Beachten Sie, dass das JDK zwar über Funktionen zum Erstellen UUID
aus String
verfügt, etwa so:
UUID uuidFromStr = UUID.fromString("ebb8e8fe-b1b1-11d7-8adb-00b0d078fa18");
Es ist etwas langsamer als die JUG-Version: Weitere Informationen finden Sie unter Messen der Leistung von Java UUID.fromString().
JUG-Glas unter target/
gebaut:
target/java-uuid-generator-5.1.0-SNAPSHOT.jar
kann auch als einfaches Befehlszeilen-UUID-Generierungstool verwendet werden.
Um die Nutzung anzuzeigen, können Sie Folgendes tun:
java -jar target/java-uuid-generator-5.1.0-SNAPSHOT.jar
und erhalten Sie vollständige Anweisungen, aber um 5 zufallsbasierte UUIDs zu generieren, würden Sie Folgendes verwenden:
java -jar target/java-uuid-generator-5.1.0-SNAPSHOT.jar -c 5 r
(wobei -c
(oder --count
) die Anzahl der zu generierenden UUIDs bedeutet und r
die zufallsbasierte Version bedeutet)
HINWEIS: Diese Funktionalität ist ab JUG 4.1 enthalten. Bei früheren Versionen war ein etwas längerer Aufruf erforderlich, da in den Jar-Metadaten „Main-Class“ nicht angegeben war. Wenn ja, müssten Sie verwenden
java -cp target/java-uuid-generator-5.1.0-SNAPSHOT.jar com.fasterxml.uuid.Jug -c 5 r
Für JUG-Versionen 3.1 und höher ist JDK 1.6 erforderlich, um hauptsächlich auf die lokale Ethernet-MAC-Adresse zugreifen zu können. Frühere Versionen (3.0 und früher) funktionierten mit 1.4 (die java.util.UUID
einführte).
JUG-Versionen 5.0 und höher erfordern JDK 8, um zu funktionieren.
java.util.UUID
des JDK weist eine fehlerhafte Implementierung von compareTo()
auf, das einen naiven Vergleich von 64-Bit-Werten verwendet. Dies funktioniert NICHT wie erwartet, da der zugrunde liegende Inhalt grundsätzlich nicht signiert ist. Zum Beispiel zwei UUIDs:
7f905a0b-bb6e-11e3-9e8f-000000000000
8028f08c-bb6e-11e3-9e8f-000000000000
würde aufgrund der Vorzeichenerweiterung mit dem zweiten zuerst geordnet werden (der zweite Wert wird als negativ und daher als „kleiner“ betrachtet).
Aus diesem Grund sollten Sie immer einen externen Komparator verwenden, z. B. com.fasterxml.uuid.UUIDComparator
, der die erwartete Sortierreihenfolge implementiert, bei der es sich um eine einfache vorzeichenlose Sortierung handelt, die auch mit der lexikografischen (alphabetischen) Sortierung von UUIDs identisch ist (unter der Annahme einer einheitlichen Groß- und Kleinschreibung). .
Verfügbar als Teil des Tidelift-Abonnements.
Die Betreuer von java-uuid-generator
und Tausenden anderer Pakete arbeiten mit Tidelift zusammen, um kommerziellen Support und Wartung für die Open-Source-Abhängigkeiten bereitzustellen, die Sie zum Erstellen Ihrer Anwendungen verwenden. Sparen Sie Zeit, reduzieren Sie Risiken und verbessern Sie den Zustand des Codes, während Sie gleichzeitig die Betreuer der genauen Abhängigkeiten bezahlen, die Sie verwenden. Erfahren Sie mehr.
Für einfache Fehlerberichte und -korrekturen sowie Funktionsanfragen verwenden Sie bitte einfach den Projects Issue Tracker, mit Ausnahme von sicherheitsrelevanten Problemen, für die wir empfehlen, sich an den Sicherheitskontakt von Tidelift zu wenden (HINWEIS: Sie müssen dafür KEIN Abonnent sein).
Es gibt viele andere öffentlich verfügbare UUID-Generatoren. Zum Beispiel:
java.util.UUID
seit 1.4, lässt jedoch Generierungsmethoden (insbesondere zeit-/ortsbasierte) weg, weist bei vielen Vorgängen eine unterdurchschnittliche Leistung auf und implementiert Vergleiche auf nutzlose WeiseBeachten Sie, dass einige Pakete zwar behaupten, schneller zu sein als andere, dies jedoch nicht klar ist:
Daher ist es oft am besten, eine Auswahl basierend auf der Stabilität der Pakete und der API zu treffen.