Anleitung zur UUID in Java

Anleitung zur UUID in Java

1. Überblick

UUID (Universally Unique Identifier), auch als GUID (Globally Unique Identifier) ​​bekannt, steht füra 128-bit long value that is unique for all practical purposes. Die Standarddarstellung der UUID verwendet hexadezimale Ziffern (Oktette):

123e4567-e89b-12d3-a456-556642440000

Eine UUID besteht aus hexadezimalen Ziffern (jeweils 4 Zeichen) und 4 "-" - Symbolen, die ihrelength equal to 36 characters ergeben.

Die Nil-UUID ist eine spezielle Form der UUID, bei der alle Bits auf Null gesetzt sind.

In diesem Artikel werfen wir einen Blick auf die KlasseUUIDin Java.

Weitere Lektüre:

Zeichenfolge vs. Zeichenfolge in Java

Lernen Sie die Unterschiede zwischen CharSequence und String kennen.

Read more

Use char[ Array über einen String zum Bearbeiten von Passwörtern in Java?]

Untersuchen Sie verschiedene Gründe, warum wir Strings nicht zum Speichern von Kennwörtern verwenden sollten und stattdessen char [] -Arrays verwenden sollten.

Read more

Anleitung zum Java String Pool

Erfahren Sie, wie die JVM die dem String-Speicher im Java-String-Pool zugewiesene Speichermenge optimiert.

Read more

2. Struktur

Nehmen wir das Beispiel UUID:

123e4567-e89b-42d3-a456-556642440000
xxxxxxxx-xxxx-Bxxx-Axxx-xxxxxxxxxxxx

A repräsentiert die Variante, die das Layout der UUID bestimmt. Alle anderen Bits in der UUID hängen von der Einstellung der Bits im Variantenfeld ab. Die Variante wird durch 3 höchstwertige Bits von A bestimmt:

  MSB1    MSB2    MSB3
   0       X       X     reserved (0)
   1       0       X     current variant (2)
   1       1       0     reserved for Microsoft (6)
   1       1       1     reserved for future (7)

Der Wert vonA in der genannten UUID ist "a". Das binäre Äquivalent von 'a' (= 10xx) zeigt die Variante als 2. B repräsentiert die Version. Die Version in der genannten UUID (Wert vonB) ist 4.

Java bietet Methoden zum Abrufen von Variante und Version der UUID: __

UUID uuid = UUID.randomUUID();
int variant = uuid.variant();
int version = uuid.version();

Dies sind 5 verschiedene Versionen für UUIDs der Variante 2: zeitbasiert (UUIDv1), DCE-Sicherheit (UUIDv2), namensbasiert (UUIDv3 und UUIDv5), zufällig (UUIDv4).

Java bietet eine Implementierung für v3 und v4, bietet jedoch auchconstructor zum Generieren eines beliebigen UUID-Typs:

UUID uuid = new UUID(long mostSigBits, long leastSigBits);

2.1. Version 3 & 5

Die UUIDs werden mit dem Hash aus Namespace und Name generiert. Die Namespace-IDs sind UUIDs wie DNS (Domain Name System), OIDs (Object Identifiers), URLs usw.

UUID = hash(NAMESPACE_IDENTIFIER + NAME)

Der einzige Unterschied zwischen UUIDv3 und UUIDv5 ist der Hashing-Algorithmus - v3 verwendet MD5 (128 Bit), während v5 SHA-1 (160 Bit) verwendet.

Einfach ausgedrückt kürzen wir den resultierenden Hash auf 128 Bit und ersetzen dann 4 Bit für die Version und 2 Bit für die Variante.

Lassen Sie uns eine UUID vom Typ 3 generieren:

String source = namespace + name;
byte[] bytes = source.getBytes("UTF-8");
UUID uuid = UUID.nameUUIDFromBytes(bytes);

Java bietet keine Implementierung für Typ 5. Überprüfen Sie unseren Quellcoderepository für die UUIDv5.

2.2. Version 4

Die UUID v4-Implementierung verwendet Zufallszahlen als Quelle. Die Java-Implementierung istSecureRandom - wobei ein unvorhersehbarer Wert als Startwert verwendet wird, um Zufallszahlen zu generieren, um die Wahrscheinlichkeit von Kollisionen zu verringern.

Generieren wir die Version 4-UUID:

UUID uuid = UUID.randomUUID();

Generieren wir einen eindeutigen Schlüssel mit 'SHA-256' und einer zufälligen UUID:

MessageDigest salt = MessageDigest.getInstance("SHA-256");
salt.update(UUID.randomUUID().toString().getBytes("UTF-8"));
String digest = bytesToHex(salt.digest());

3. Fazit

Sowohl UUIDv3 als auch UUIDv5 haben die nette Eigenschaft, dass verschiedene Systeme dieselbe UUID mit demselben Namespace und demselben Namen generieren können. Diese werden im Wesentlichen zum Erstellen hierarchischer UUIDs verwendet.

Da beide Hash-Funktionen MD5 und SHA1 fehlerhaft sind, wird die Verwendung von v5 empfohlen. Wenn Sie nur eine einfache UUID-Generierung benötigen, kann Typ 4 für den allgemeinen Anwendungsfall in Ordnung sein.

Und wie immer ist der Quellcode der Implementierungover on Github verfügbar.