UUID的 类型
一个典型的 UID 显示在 5 个由连字符分隔的组中,格式为 8-4-4-4-12,总共 36 个字符(32 个字母数字字符和 4 个连字符)。
123e4567-e89b-12d3-a456-426655440000
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
这里“M”表示 UUID 版本,“N”表示 UUID 变体。
- 变体字段包含一个标识 UUID 布局的值。
- version 字段包含一个描述此 UUID 类型的值。有五种不同的基本 UUID 类型。
- 基于时间的 UUID(版本 1) - 从时间和节点 ID 生成
- DCE(分布式计算环境)安全性(版本 2)——从标识符(通常是组或者用户 ID)、时间和节点 ID 生成
- 基于名称(版本 3)- 由命名空间标识符和名称的 MD5(128 位)散列生成
- 随机生成的 UUID(版本 4) - 使用随机或者伪随机数生成
- 基于名称的使用 SHA-1 散列(版本 5)推荐 - 由命名空间标识符和名称的 SHA-1(160 位)散列生成。
欢迎 on
it
road
Java 生成UUID - 版本 4
默认 API randomUUID()
是一个静态工厂,用于检索类型 4(伪随机生成)UUID。
对于大多数用例来说,它已经足够好了。
UUID uuid = UUID.randomUUID(); System.out.println(uuid); System.out.println(uuid.variant()); //2 System.out.println(uuid.version()); //4
输出:
17e3338d-344b-403c-8a87-f7d8006d6e33 2 4
生成 UUID 版本 5
Java 不提供内置 API 来生成版本 5 UUID,因此我们必须创建自己的实现。
下面代码可供参考
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; } }
UUID uuid = UUID5.fromUTF8("954aac7d-47b2-5975-9a80-37eeed186527"); System.out.println(uuid); System.out.println(uuid.variant()); System.out.println(uuid.version());
d1d16b54-9757-5743-86fa-9ffe3b937d78 2 5
日期:2020-09-17 00:09:20 来源:oir作者:oir