# Java UUID4 ### 1. UUID Types ##### A typical UID is displayed in 5 groups separated by hyphens, in the form 8-4-4-4-12 for a total of 36 characters (32 alphanumeric characters and 4 hyphens). >123e4567-e89b-12d3-a456-426655440000 xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx * The version field holds a value that describes the type of this UUID. There are five different basic types of UUIDs. 1. Time-Based UUID (Version 1) – generated from a time and a node id 2. DCE (Distributed Computing Environment) security (Version 2) – generated from an identifier (usually a group or user id), time, and a node id 3. Name-based (Version 3) – generated by MD5 (128 bits) hashing of a namespace identifier and name 4. Randomly generated UUIDs (Version 4) – generated using a random or pseudo-random number 5. Name-based using SHA-1 hashing (Version 5) Recommended – generated by SHA-1 (160 bits) hashing of a namespace identifier and name. Java does not provide its implementation. We shall create our own. ### 2. Java UUID Example >UUID.randomUUID() – Version 4 ```java= UUID uuid = UUID.randomUUID(); System.out.println(uuid); System.out.println(uuid.variant()); //2 System.out.println(uuid.version()); //4 //console 17e3338d-344b-403c-8a87-f7d8006d6e33 2 4 ``` >Generate Version 5 UUID ```java= //UUID5.java import java.nio.ByteOrder; import java.nio.charset.Charset; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.UUID; public class UUID5 { public static UUID fromUTF8(String name) { return fromBytes(name.getBytes(Charset.forName("UTF-8"))); } private static UUID fromBytes(byte[] name) { if (name == null) { throw new NullPointerException("name == null"); } try { MessageDigest md = MessageDigest.getInstance("SHA-1"); return makeUUID(md.digest(name), 5); } catch (NoSuchAlgorithmException e) { throw new AssertionError(e); } } private static UUID makeUUID(byte[] hash, int version) { long msb = peekLong(hash, 0, ByteOrder.BIG_ENDIAN); long lsb = peekLong(hash, 8, ByteOrder.BIG_ENDIAN); // Set the version field msb &= ~(0xfL << 12); msb |= ((long) version) << 12; // Set the variant field to 2 lsb &= ~(0x3L << 62); lsb |= 2L << 62; return new UUID(msb, lsb); } private static long peekLong(final byte[] src, final int offset, final ByteOrder order) { long ans = 0; if (order == ByteOrder.BIG_ENDIAN) { for (int i = offset; i < offset + 8; i += 1) { ans <<= 8; ans |= src[i] & 0xffL; } } else { for (int i = offset + 7; i >= offset; i -= 1) { ans <<= 8; ans |= src[i] & 0xffL; } } return ans; } } ``` >Java Version 5 UUID Example ```java= UUID uuid = UUID5.fromUTF8("954aac7d-47b2-5975-9a80-37eeed186527"); System.out.println(uuid); System.out.println(uuid.variant()); System.out.println(uuid.version()); //console d1d16b54-9757-5743-86fa-9ffe3b937d78 2 5 ``` 資料來源: [Java UUID Generator Example](https://howtodoinjava.com/java/java-misc/java-uuid/) ###### tags: `Spring boot` `UUID`