UUID ist die Abkürzung für Universally Unique Identifier, was soviel wie "weltweit eindeutige Kennzeichnung" bedeutet (siehe Wikipedia). Damit werden in der Softwareentwicklung Elemente in verteilten Systemen eindeutig gekennzeichnet.
Eine UUID besteht aus einer 16-Byte-Zahl, die hexadezimal notiert und in fünf Gruppen unterteilt wird. Beispiel für eine UUID: 1234abcd-1234-1234-9876-9876abcd1234
.
UUID in Minecraft
In Minecraft besteht das verteilte System aus dem Authentication Service von Mojang, der das Login des Spielers prüft, aus den Clients der Spieler und aus den Minecraft-Servern in der ganzen Welt, auf denen man Minecraft spielen kann. In all diesen Elementen des verteilten Systems soll der Spieler (genauer: ein Minecraft-Account) eindeutig identifizierbar sein.
Durch die UUID erhält jeder Minecraft-Account eine eindeutige Seriennummer. Der Accountbesitzer (der Spieler) kann dann seinen Spielernamen oder seine E-Mail-Adresse ändern und behält trotzdem immer die selbe UUID.
Die eigene UUID kann man aus der Datei .minecraft/launcher_profiles.json ablesen. Dort steht sie im Abschnitt "authenticationDatabase". Achtung: Dort stehen verschiedene IDs, die richtige ist die "uuid". Im Spiel wird die UUID beim Fahren mit der Maus über einen Spielernamen im Chat angezeigt.
Mit einer UUID kann man jedoch nicht nur Spieler, sondern beliebige Elemente kennzeichnen. In Minecraft haben z.B. sämtliche Objekte (d.h. alle Kreaturen, Fahrzeuge, Geschosse, Drops etc.) eine UUID. Ebenso die Attribut-Modifikatoren.
Umrechnung UUID in UUIDLeast und UUIDMost
In den NBT-Daten werden UUIDs nicht als String gespeichert, sondern in zwei Hälften geteilt und als vorzeichenbehaftete Long-Zahlen UUIDLeast und UUIDMost gespeichert.
Für die Umrechnung ist es am einfachsten, externe Werkzeuge zu benutzen, die neben den hier erklärten Formaten auch in das int-array Format umrechnen können.
Ein gutes Beispiel ist diese Seite: https://www.soltoder.com/mc-uuid-converter/
Eine manuelle Umrechnung kann allerdings auch durch die folgenden Schritte umgesetzt werden:
Die UUID ist 32 Ziffern lang, die Trennstriche gehören nicht dazu | 1234abcd-1234-1234-9876-9876abcd1234
|
UUID halbieren: die ersten 16 Ziffern und die letzten 16 Ziffern | vorne (most): 1234abcd12341234 hinten (least): 98769876abcd1234
|
Die ersten und die letzten 16 Ziffern jeweils in eine Dezimalzahl umrechnen, z. B. mit diesem Umrechner der auch mit sehr großen Zahlen umgehen kann | 1234abcd12341234 => 1311862288733704756 98769876abcd1234 => 10986135976472810036
|
Die umgerechneten Dezimalzahlen haben kein Vorzeichen, liegen also im Wertebereich 0 bis 18446744073709551615 = 1616-1. Die gesuchten Long-Zahlen sind dagegen vorzeichenbehaftet, liegen also im Wertebereich -9223372036854775808 bis 9223372036854775807 = -1616/2 bis 1616/2-1 (siehe Long-Zahlen im NBT-Format). Daher muss man von jeder Dezimalzahl, die größer als 9223372036854775807 ist, 18446744073709551616 abziehen. Für diese Rechnung kann man z. B. den Web 2.0 Rechner verwenden | 1311862288733704756 ist kleiner als9223372036854775807 , daher: 1311862288733704756 = UUIDMost10986135976472810036 ist größer als 9223372036854775807 , daher:10986135976472810036 - 18446744073709551616 = UUIDLeast
|
Und umgekehrt:
UUIDMost und UUIDLeast sind vorzeichenbehaftete Long-Zahlen im NBT-Format | UUIDMost: 1311862288733704756 UUIDLeast: -7460608097236741580
|
Wenn UUIDMost oder UUIDLeast negativ ist, dann 18446744073709551616 addieren (mit dem Web 2.0 Rechner) | UUIDMost: 1311862288733704756 UUIDLeast: -7460608097236741580 + 18446744073709551616 = 10986135976472810036
|
In hexadezimale Zahlen umrechnen (mit dem Converter) | UUIDMost (vorne): 1234abcd12341234 UUIDLeast (hinten): 98769876abcd1234
|
UUID zusammensetzen mit Trennstrichen | 1234abcd-1234-1234-9876-9876abcd1234
|
UUID setzen
Wenn man mit dem Befehl /summon
ein Objekt spawnt, wird ihm normalerweise vom Spiel automatisch eine UUID gegeben. Man kann aber auch selbst eine UUID vergeben, damit man das Objekt über den Befehl /execute if entity
eindeutig identifizieren kann. Dazu belegt man einfach UUIDMost mit 0 und UUIDLeast mit einer kleinen Zahl. Weil es Long-Zahlen sind, muss man ein "L" anhängen (siehe NBT-Format), sonst wird die Eingabe ignoriert und eine automatische UUID vergeben. Beispiele:
UUIDMost | UUIDLeast | UUID |
---|---|---|
0L | 0L | 00000000-0000-0000-0000-000000000000
|
0L | 1L | 00000000-0000-0000-0000-000000000001
|
0L | 9L | 00000000-0000-0000-0000-000000000009
|
0L | 10L | 00000000-0000-0000-0000-00000000000A
|
- Der Befehl
/summon pig ~ ~ ~ {UUIDMost:0L, UUIDLeast:2L}
erzeugt ein Schwein mit der UUID 2. - Der Befehl
/say @e[type=pig]
nennt alle Schweine. Hat man vorher F3+H gedrückt und fährt mit der Maus über die Namen der Schweine (normalerweise heißen sie einfach "Schwein"), sieht man ihre UUID. - Der Befehl
/execute if entity @e[type=pig,nbt={UUIDMost:0L, UUIDLeast:2L}]
ist erfolgreich, wenn es ein Schwein mit der UUID 2 gibt.
Existieren in Minecraft jedoch Objekte mit der selben UUID, kann es zu Fehlern kommen. Unter anderem können dann Fehlermeldungen wie "Dieses Objekt kann nicht gefunden werden" auftreten. Man kann dieses Problem nur lösen, indem man diese Objekte per Hand tötet oder den Befehl /kill
anwendet und die Welt neu öffnet.
Spielername zu UUID finden
Um den Spielernamen zu einer UUID zu finden, verwendet man die Mojang API. Die UUID muss dabei ohne Trennstriche eingegeben werden. Beispiel:
https://api.mojang.com/user/profiles/f498513ce8c84773be26ecfc7ed5185d/names
liefert den Spielernamen "jeb".
Umgekehrt kann man zu einem Spielernamen auch die UUID ermitteln:
https://api.mojang.com/users/profiles/minecraft/jeb
liefert die UUID "f498513ce8c84773be26ecfc7ed5185d".
Technische Aspekte
Wertebereich
Eine UUID kann als eine 128 Bit Zahl ausgedrückt werden, was bedeutet, dass sie alle ganzzahligen Werte von -(2^127)
bis (2^127)-1
unterstützt. Dabei ist es wichtig, zu wissen, dass diese Auswertung sich nicht auf den potenziell generierten Bereich bezieht, sondern sich stattdessen auf die Kapazität des Formats konzentriert.
String Format Abschnittnamen
String Format UUIDs folgen dem Muster aaaaaaaa-bbbb-cccc-ddee-ffffffffffff
.
Abbschnittname | Verwendetes Zeichen | Bit-Bereich | ||
---|---|---|---|---|
Von | Bis | Größe | ||
time-low | a |
96 | 127 | 32 |
time-mid | b |
80 | 95 | 16 |
time-high-and-version | c |
54 | 79 | 16 |
clock-seq-and-reserved | d |
36 | 53 | 8 |
clock-seq-low | e |
48 | 45 | 8 |
node | f |
0 | 47 | 48 |
Generierung
Minecraft verwended Version 4 UUIDs, was bedeutet, dass die gesamte Zahl, unter Ausnahme der Metadaten, zufällig generiert wird. Eine Tabelle mit den Platzierungen und Werten der Metadaten innerhalb der UUID:
Lange Version
Komprimierte Version
Geschichte
Versionsgeschichte der Java Edition | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Standard-Ressourcen |
| ||||
---|---|---|---|---|---|
Standard-Weltdaten |
| ||||
Spielwelt | |||||
Software | |||||
Speicherformate | |||||
Einstellungen | |||||
Mehrspieler | |||||
Historisch |