Útmutató az UUID használatához Java-ban

1. Áttekintés

Az UUID (univerzálisan egyedi azonosító), más néven GUID (globálisan egyedi azonosító) képviseli 128 bites hosszú érték, amely minden gyakorlati célra egyedülálló. Az UUID szokásos ábrázolása hatszögjegyeket (oktetteket) használ:

123e4567-e89b-12d3-a456-556642440000

Az UUID hexadecimális számokból áll (egyenként 4 karakterből) és 4 „-” szimbólumból hossza 36 karakter.

A Nil UUID az UUID speciális formája, amelyben az összes bit nullára van állítva.

Ebben a cikkben megnézzük a UUID osztály Java-ban. Először megvizsgáljuk, hogyan kell használni magát az osztályt. Ezután megvizsgáljuk az UUID-k különféle típusait és azt, hogy miként állíthatjuk elő őket Java-ban.

2. A UUID Osztály

Az UUID osztálynak egyetlen konstruktora van:

UUID uuid = új UUID (long mostSignificant64Bits, long leastSignificant64Bits);

Ha ezt a konstruktort akarjuk használni, két hosszú értéket kell megadnunk. Ez azonban megköveteli, hogy mi magunk állítsuk elő az UUID bitmintáját.

A kényelem érdekében három statikus módszer létezik az UUID létrehozására. Ezek:

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

Ez a módszer létrehozza a 3-as verzió UUID-jét a megadott bájt tömbből.

UUID uuid = UUID.randomUUID (); 

A randomUUID () metódus létrehozza a 4-es verzió UUID-jét. Ez a legkényelmesebb módszer az UUID létrehozására.

UUID uuid = UUID.fromString (Karakterlánc uuidHexDigitString); 

A harmadik statikus módszer egy UUID objektumot ad vissza, megadva az adott UUID karakterlánc ábrázolását.

Most nézzük meg, hogyan épül fel az UUID.

3. Felépítés

Vegyük az UUID példát:

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

3.1. UUID variáns

A azt a változatot jelenti, amely meghatározza az UUID elrendezését. Az UUID összes többi bitje a variáns mezőben lévő bitek beállításától függ. A változatot az A 3 legjelentősebb bitje határozza meg:

 MSB1 MSB2 MSB3 0 X X fenntartva (0) 1 0 X aktuális változat (2) 1 1 0 a Microsoft számára fenntartva (6) 1 1 1 a jövő számára fenntartva (7)

Az értéke A az említett UUID-ben „a”. Az „a” bináris megfelelője (= 10xx) a változatot 2-nek mutatja.

3.2. UUID verzió

B a verziót képviseli. Az említett UUID verziója ( B) értéke 4.

A Java módszereket kínál az UUID változatának és változatának megszerzéséhez:

UUID uuid = UUID.randomUUID (); int variáns = uuid.változat (); int verzió = uuid.version ();

Ez 5 különböző változat a 2. változatú UUID-ekhez: Időalapú (UUIDv1), DCE Biztonság (UUIDv2), Névalapú (UUIDv3 és UUIDv5), Véletlenszerű (UUIDv4).

A Java megvalósítást nyújt a v3 és v4 számára, de a konstruktőr bármilyen típusú UUID előállításához:

UUID uuid = új UUID (long mostSigBits, long leastSigBits);

4. Az UUID verziók

4.1. 1. verzió

Az UUID 1. verziója az aktuális időbélyegzőn alapul, amelyet 1582. október 15-étől számítva 100 nanoszekundum egységekben mérnek, összefűzve annak az eszköznek a MAC-címével, ahol az UUID létrejön.

Ha az adatvédelem aggodalomra ad okot, akkor az 1. UUID verzió alternatívaként egy véletlenszerű 48 bites számmal is előállítható a MAC cím helyett.

Ebben a cikkben ezt az alternatívát mutatjuk be. Először a 64 legkevesebb és legjelentősebb bitet állítjuk elő hosszú értékként:

privát statikus hosszú get64LeastSignificantBitsForVersion1 () {Random random = new Random (); hosszú random63BitLong = random.nextLong () & 0x3FFFFFFFFFFFFFFFL; hosszú változat3BitFlag = 0x8000000000000000L; return randomBitLong + variant3BitFlag; } privát statikus hosszú get64MostSignificantBitsForVersion1 () {LocalDateTime start = LocalDateTime.of (1582, 10, 15, 0, 0, 0); Duration duration = Duration.between (start, LocalDateTime.now ()); hosszú másodpercek = duration.getSeconds (); hosszú nanók = duration.getNano (); hosszú időForUuidIn100Nanos = másodperc * 10000000 + nanó * 100; long least12SignificatBitOfTime = (timeForUuidIn100Nanos & 0x000000000000FFFFL) >> 4; hosszú változat = 1 << 12; return (timeForUuidIn100Nanos & 0xFFFFFFFFFFFF0000L) + verzió + legkevesebb12SignificatBitOfTime; }

Ezután átadhatjuk ezt a két értéket az UUID konstruktorának:

public static UUID geneType1UUID () {long most64SigBits = get64MostSignificantBitsForVersion1 (); long least64SigBits = get64LeastSignificantBitsForVersion1 (); return new UUID (most64SigBits, legkevesebb64SigBits); }

4.2. 2. verzió

A 2. verzió az időbélyegzőn és a MAC címen is alapul. Az RFC 4122 azonban nem határozza meg a pontos generációs részleteket, ezért a cikkben nem vizsgáljuk meg a megvalósítást.

4.3. 3. és 5. verzió

Az UUID-ok a névtér és a név kivonatával készülnek. A névtér-azonosítók UUID-k, például Domain Name System (DNS), Object Identifier (OID), URL-ek stb.

UUID = kivonat (NAMESPACE_IDENTIFIER + NAME)

Az egyetlen különbség az UUIDv3 és az UUIDv5 között a Hashing algoritmus - a v3 MD5-et (128 bit), míg a v5 az SHA-1-et (160 bit) használja.

Egyszerűen fogalmazva, a kapott hash-t 128-bitesre csonkoljuk, majd a verzióhoz 4, a változathoz 2 bitet cserélünk.

Generáljuk a 3. típusú UUID-t:

byte [] nameSpaceBytes = bytesFromUUID (névtér); bájt [] névBájt = név.getBájt ("UTF-8"); bájt [] eredmény = joinBytes (nameSpaceBytes, nameBytes); UUID uuid = UUID.nameUUIDFromBytes (eredmény);

Itt fontos megjegyezni, hogy a névtér hex-stringjét először bájt tömbgé kell átalakítani.

A Java nem biztosítja az 5. típusú megvalósítást. Ellenőrizze az UUIDv5 forráskódtárát.

4.4. 4. verzió

Az UUID v4 implementáció véletlenszámokat használ forrásként. A Java implementáció SecureRandom - amely kiszámíthatatlan értéket használ magként véletlenszámok előállítására az ütközések esélyének csökkentése érdekében.

Generáljuk az UUID 4-es verzióját:

UUID uuid = UUID.randomUUID ();

Hozzunk létre egy egyedi kulcsot az „SHA-256” és egy véletlenszerű UUID használatával:

MessageDigest salt = MessageDigest.getInstance ("SHA-256"); salt.update (UUID.randomUUID (). toString (). getBytes ("UTF-8")); Karaktersorozat = bájtToHex (só.digest ());

5. Következtetés

Ebben a cikkben láttuk, hogy hogyan épül fel az UUID, mely változatok és verziók vannak. Megtanultuk, hogy a Java mely verziókhoz kínál out-of-the-box megvalósítást, és kódpéldákat néztünk a többi verzió létrehozásához.

És mint mindig, a megvalósítás forráskódja elérhető a Githubon.