Erstellen Sie eine GUID in Java

377

Was sind einige der besten Möglichkeiten, um eine GUID in Java zu erstellen?

Chris Dutrow
quelle
3
Die Frage unter stackoverflow.com/questions/325443/generate-uuid-in-java bezieht sich mehr auf GUID-Kollisionen als darauf, wie das Äquivalent einer GUID im Java-Tech-Stack ist, was (glaube ich) eher das ist Schwerpunkt dieser Frage.
Jon Adams

Antworten:

347

Schauen Sie sich die mit Java 5 und höher gebündelte UUID-Klasse an .

Zum Beispiel:

  • Wenn Sie eine zufällige UUID möchten, können Sie die randomUUID- Methode verwenden.
  • Wenn Sie möchten, dass eine UUID auf einen bestimmten Wert initialisiert wird, können Sie den UUID-Konstruktor oder die fromString- Methode verwenden.
Mark Byers
quelle
7
Wenn Sie ein Beispiel wie Kaleb Brasee hinzufügen, wäre Ihre gute Antwort noch besser.
Zero3
Funktioniert mindestens in AndroidStudio 2.3 und auf API-Level 21 und höher. Vielleicht auch weiter hinten.
Raddevus
5
TL; DR ... "UUID uuid = UUID.randomUUID ();"
Aviram Fireberger
419

java.util.UUID.randomUUID();

Kaleb Brasee
quelle
2
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.

Stephen C.
quelle
1
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:

import java.util.UUID;

public class RandomStringUUID {
    public static void main(String[] args) {
        UUID uuid = UUID.randomUUID();
        System.out.println("UUID=" + uuid.toString() );
    }
}
Anton Belev
quelle
7

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:

  • 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.
  • Webdienst
    Beispielsweise erstellt der UUID-Generator die Versionen 1 und 3 sowie Nullwerte und GUID .
Basil Bourque
quelle
3
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).
DennisK