Guide til UUID i Java

1. Oversikt

UUID (Universally Unique Identifier), også kjent som GUID (Globally Unique Identifier) ​​representerer en 128-bit lang verdi som er unik for alle praktiske formål. Standard representasjonen av UUID bruker heksesifre (oktetter):

123e4567-e89b-12d3-a456-556642440000

En UUID består av sekskantesifre (4 tegn hver) sammen med 4 "-" symboler som utgjør dens lengde lik 36 tegn.

Nil UUID er en spesiell form for UUID der alle bitene er satt til null.

I denne artikkelen vil vi se på UUID klasse i Java. Først skal vi se på hvordan du bruker klassen selv. Deretter ser vi på de forskjellige typene UUID-er og hvordan vi kan generere dem i Java.

2. Den UUID Klasse

UUID-klassen har en enkelt konstruktør:

UUID uuid = ny UUID (lang mostSignificant64Bits, lang minsteSignificant64Bits);

Hvis vi vil bruke denne konstruktøren, må vi oppgi to lange verdier. Imidlertid krever det at vi selv konstruerer bitmønsteret for UUID.

For enkelhets skyld er det tre statiske metoder for å lage et UUID. Disse er:

UUID uuid = UUID.nameUUIDFromBytes (byte [] byte); 

Denne metoden oppretter en versjon 3 UUID fra den gitte byte-arrayen.

UUID uuid = UUID.randomUUID (); 

De randomUUID () metoden oppretter en versjon 4 UUID. Dette er den mest praktiske måten å lage en UUID på.

UUID uuid = UUID.fromString (String uuidHexDigitString); 

Den tredje statiske metoden returnerer et UUID-objekt gitt strengrepresentasjonen til et gitt UUID.

La oss nå se på hvordan et UUID er strukturert.

3. Struktur

La oss ta eksemplet UUID:

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

3.1. UUID-variant

EN representerer varianten som bestemmer utformingen av UUID. Alle andre biter i UUID avhenger av innstillingen av bitene i variantfeltet. Varianten bestemmes av 3 mest betydningsfulle bit A:

 MSB1 MSB2 MSB3 0 X X reservert (0) 1 0 X nåværende variant (2) 1 1 0 reservert for Microsoft (6) 1 1 1 reservert for fremtid (7)

Verdien av EN i nevnte UUID er ‘a’. Den binære ekvivalenten til ‘a’ (= 10xx) viser varianten som 2.

3.2. UUID-versjon

B representerer versjonen. Versjonen i nevnte UUID (verdi av B) er 4.

Java gir metoder for å få variant og versjon av UUID:

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

Dette er 5 forskjellige versjoner for variant 2 UUID: Time Based (UUIDv1), DCE Security (UUIDv2), Name Based (UUIDv3 and UUIDv5), Random (UUIDv4).

Java gir en implementering for v3 og v4, men gir også en konstruktør for å generere alle typer UUID:

UUID uuid = ny UUID (lang mostSigBits, lang minsteSigBits);

4. UUID-versjonene

4.1. Versjon 1

UUID versjon 1 er basert på gjeldende tidsstempel, målt i enheter på 100 nanosekunder fra 15. oktober 1582, sammenkoblet med MAC-adressen til enheten der UUID er opprettet.

Hvis personvern er en bekymring, kan UUID versjon 1 alternativt genereres med et tilfeldig 48-bit nummer i stedet for MAC-adressen.

I denne artikkelen vil vi dette alternativet. Først genererer vi de 64 minste og mest betydningsfulle bitene som lange verdier:

privat statisk lang get64LeastSignificantBitsForVersion1 () {Tilfeldig tilfeldig = ny tilfeldig (); lang random63BitLong = random.nextLong () & 0x3FFFFFFFFFFFFFFFL; lang variant3BitFlag = 0x8000000000000000L; returner tilfeldig63BitLong + variant3BitFlag; } privat statisk lang get64MostSignificantBitsForVersion1 () {LocalDateTime start = LocalDateTime.of (1582, 10, 15, 0, 0, 0); Varighet varighet = Varighet. Mellom (start, LocalDateTime.now ()); lange sekunder = duration.getSeconds (); lange nanoer = varighet.getNano (); lang tidForUuidIn100Nanos = sekunder * 10000000 + nanos * 100; lang minste12SignificatBitOfTime = (timeForUuidIn100Nanos & 0x000000000000FFFFL) >> 4; lang versjon = 1 << 12; return (timeForUuidIn100Nanos & 0xFFFFFFFFFFFF0000L) + versjon + minst12SignificatBitOfTime; }

Vi kan da overføre disse to verdiene til konstruktøren av UUID:

offentlig statisk UUID genererer Type1UUID () {lang most64SigBits = get64MostSignificantBitsForVersion1 (); lang minste64SigBits = get64LeastSignificantBitsForVersion1 (); returner nytt UUID (most64SigBits, minst64SigBits); }

4.2. Versjon 2

Versjon 2 er også basert på en tidsstempel og MAC-adressen. Imidlertid spesifiserer RFC 4122 ikke nøyaktige generasjonsdetaljer, derfor ser vi ikke på en implementering i denne artikkelen.

4.3. Versjon 3 og 5

UUID-ene genereres ved hjelp av hash-navnområdet og navnet. Navneromidentifikatorene er UUID-er som Domain Name System (DNS), Object Identifiers (OIDs), URL-er, etc.

UUID = hash (NAMESPACE_IDENTIFIER + NAME)

Den eneste forskjellen mellom UUIDv3 og UUIDv5 er Hashing-algoritmen - v3 bruker MD5 (128 bits) mens v5 bruker SHA-1 (160 bits).

Enkelt sagt, vi trunker den resulterende hash til 128-bits og erstatter deretter 4 bit for versjonen og 2 bit for varianten.

La oss generere type 3 UUID:

byte [] nameSpaceBytes = bytesFromUUID (namespace); byte [] nameBytes = name.getBytes ("UTF-8"); byte [] resultat = joinBytes (nameSpaceBytes, nameBytes); UUID uuid = UUID.nameUUIDFromBytes (resultat);

Her er det viktig å merke seg at hex-strengen for navneområdet først må konverteres til en byte-array.

Java gir ikke implementeringen for type 5. Sjekk kildekodedepotet vårt for UUIDv5.

4.4. Versjon 4

UUID v4-implementeringen bruker tilfeldige tall som kilde. Java-implementeringen er SecureRandom - som bruker en uforutsigbar verdi som frøet for å generere tilfeldige tall for å redusere sjansen for kollisjoner.

La oss generere UUID versjon 4:

UUID uuid = UUID.randomUUID ();

La oss generere en unik nøkkel ved hjelp av 'SHA-256' og en tilfeldig UUID:

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

5. Konklusjon

I denne artikkelen så vi hvordan et UUID er strukturert, hvilke varianter og versjoner det er. Vi lærte for hvilke versjoner Java gir en out-of-the-box implementering, og så på kodeeksempler for å generere de andre versjonene.

Og som alltid er implementeringskildekoden tilgjengelig på Github.


$config[zx-auto] not found$config[zx-overlay] not found