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.