Vodič za UUID na Javi

1. Pregled

UUID (univerzalno jedinstveni identifikator), također poznat kao GUID (globalno jedinstveni identifikator) predstavlja 128-bitna vrijednost jedinstvena za sve praktične svrhe. Standardni prikaz UUID-a koristi hex znamenke (oktete):

123e4567-e89b-12d3-a456-556642440000

UUID se sastoji od heksadecimalnih znamenki (po 4 znaka) zajedno s 4 simbola "-" koji čine njegovu duljina jednaka 36 znakova.

Nil UUID je poseban oblik UUID-a u kojem su svi bitovi postavljeni na nulu.

U ovom ćemo članku pogledati UUID razred u Javi. Prvo ćemo pogledati kako koristiti sam razred. Zatim ćemo razmotriti različite vrste UUID-ova i kako ih možemo generirati u Javi.

2. The UUID Razred

Klasa UUID ima jedan konstruktor:

UUID uuid = novi UUID (dugo mostSignificant64Bits, long leastSignificant64Bits);

Ako želimo koristiti ovaj konstruktor, moramo navesti dvije duge vrijednosti. Međutim, zahtijeva da sami napravimo bitni obrazac za UUID.

Radi praktičnosti postoje tri statičke metode za stvaranje UUID-a. Ovi su:

UUID uuid = UUID.nameUUIDFromBytes (bajt [] bajta); 

Ova metoda stvara verziju 3 UUID iz datog bajt polja.

UUID uuid = UUID.randomUUID (); 

The randomUUID () metoda stvara verziju 4 UUID. Ovo je najprikladniji način stvaranja UUID-a.

UUID uuid = UUID.fromString (Niz uuidHexDigitString); 

Treća statička metoda vraća UUID objekt s obzirom na nizni prikaz datog UUID-a.

Pogledajmo sada kako je strukturiran UUID.

3. Struktura

Uzmimo primjer UUID:

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

3.1. UUID varijanta

A predstavlja varijantu koja određuje izgled UUID-a. Svi ostali bitovi u UUID-u ovise o postavci bitova u polju varijante. Varijanta je određena s 3 najznačajnija bita A:

 MSB1 MSB2 MSB3 0 X X rezervirano (0) 1 0 X trenutna inačica (2) 1 1 0 rezervirano za Microsoft (6) 1 1 1 rezervirano za budućnost (7)

Vrijednost A u spomenutom UUID-u je 'a'. Binarni ekvivalent "a" (= 10xx) prikazuje varijantu kao 2.

3.2. UUID verzija

B predstavlja verziju. Verzija u spomenutom UUID-u (vrijednost B) je 4.

Java nudi metode za dobivanje varijante i verzije UUID-a:

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

Ovo je 5 različitih verzija za UUID varijante 2: Na temelju vremena (UUIDv1), DCE sigurnosti (UUIDv2), Na temelju imena (UUIDv3 i UUIDv5), Nasumično (UUIDv4).

Java pruža implementaciju za v3 i v4, ali također nudi i konstruktor za generiranje bilo koje vrste UUID-a:

UUID uuid = novi UUID (dugi mostSigBits, dugi mostSigBits);

4. UUID verzije

4.1. Verzija 1

UUID verzija 1 temelji se na trenutnoj vremenskoj oznaci, mjerenoj u jedinicama od 100 nanosekundi od 15. listopada 1582., spojene s MAC adresom uređaja na kojem je UUID stvoren.

Ako je privatnost zabrinjavajuća, UUID verzija 1 alternativno se može generirati slučajnim 48-bitnim brojem umjesto MAC adrese.

U ovom ćemo članku pronaći ovu alternativu. Prvo ćemo generirati 64 najmanje i najznačajnije bitove kao duge vrijednosti:

private static long get64LeastSignificantBitsForVersion1 () {Random random = novo Random (); dugo random63BitLong = random.nextLong () & 0x3FFFFFFFFFFFFFFFL; duga varijanta3BitFlag = 0x8000000000000000L; vrati random63BitLong + variant3BitFlag; } privatni statički long get64MostSignificantBitsForVersion1 () {LocalDateTime start = LocalDateTime.of (1582, 10, 15, 0, 0, 0); Trajanje trajanja = Duration.bet Between (start, LocalDateTime.now ()); duge sekunde = duration.getSeconds (); dugo nanos = trajanje.getNano (); long timeForUuidIn100Nanos = sekunde * 10000000 + nanos * 100; dugo najmanje12SignificatBitOfTime = (timeForUuidIn100Nanos & 0x000000000000FFFFL) >> 4; duga verzija = 1 << 12; return (timeForUuidIn100Nanos & 0xFFFFFFFFFFFF00000000) + verzija + minimum12SignificatBitOfTime; }

Zatim ove dvije vrijednosti možemo proslijediti konstruktoru UUID-a:

javni statički UUID generirajType1UUID () {long most64SigBits = get64MostSignificantBitsForVersion1 (); long minimum64SigBits = get64LeastSignificantBitsForVersion1 (); vratite novi UUID (most64SigBits, minimum64SigBits); }

4.2. Verzija 2

Verzija 2 temelji se i na vremenskoj oznaci i MAC adresi. Međutim, RFC 4122 ne navodi točne detalje generiranja, stoga u ovom članku nećemo razmatrati provedbu.

4.3. Verzije 3 i 5

UUID-ovi se generiraju pomoću hasha prostora imena i imena. Identifikatori prostora imena su UUID-ovi poput DNS (Domain Name System), Identifikatora objekata (OID), URL-ova itd.

UUID = hash (NAMESPACE_IDENTIFIER + IME)

Jedina razlika između UUIDv3 i UUIDv5 je algoritam raspršivanja - v3 koristi MD5 (128 bita), dok v5 koristi SHA-1 (160 bita).

Jednostavno rečeno, rezijemo rezultirajuće hash na 128-bit, a zatim zamjenjujemo 4 bita za verziju i 2 bita za varijantu.

Izradimo UUID tipa 3:

bajt [] nameSpaceBytes = bytesFromUUID (prostor imena); bajt [] nameBytes = name.getBytes ("UTF-8"); bajt [] rezultat = joinBytes (nameSpaceBytes, nameBytes); UUID uuid = UUID.nameUUIDFromBytes (rezultat);

Ovdje je važno napomenuti da hex-string za prostor imena prvo treba pretvoriti u bajtni niz.

Java ne nudi implementaciju za tip 5. Provjerite u našem spremištu izvornog koda UUIDv5.

4.4. Verzija 4

Implementacija UUID v4 koristi slučajne brojeve kao izvor. Implementacija Jave je SecureRandom - koji koristi nepredvidivu vrijednost kao sjeme za generiranje slučajnih brojeva kako bi smanjio mogućnost sudara.

Izradimo verziju 4 UUID:

UUID uuid = UUID.randomUUID ();

Izradimo jedinstveni ključ pomoću ‘SHA-256’ i slučajnog UUID-a:

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

5. Zaključak

U ovom smo članku vidjeli kako je strukturiran UUID, koje inačice i verzije postoje. Saznali smo za koje verzije Java nudi izvanrednu implementaciju i pogledali smo primjere koda kako bismo generirali ostale verzije.

Kao i uvijek, izvorni kod implementacije dostupan je na Githubu.


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