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
Java 如何生成UUID(通用唯一标识符)

生成 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