问题
生成UUID版本5作为唯一ID。某些场景不能依赖数据库来生成唯一ID,就需要使用UUID来生成唯一性ID。
解决
Java
private static final String NAMESPACE_URL = "6ba7b811-9dad-11d1-80b4-00c04fd430c8";
/**
* Type 5 UUID Generation
*/
public static UUID generateType5UUID(String namespace, String name) {
String source = namespace + name;
byte[] bytes = source.getBytes(StandardCharsets.UTF_8);
return type5UUIDFromBytes(bytes);
}
private static UUID type5UUIDFromBytes(byte[] name) {
MessageDigest md;
try {
md = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException nsae) {
throw new InternalError("SHA-1 not supported", nsae);
}
byte[] bytes = Arrays.copyOfRange(md.digest(name), 0, 16);
bytes[6] &= 0x0f; /* clear version */
bytes[6] |= 0x50; /* set to version 5 */
bytes[8] &= 0x3f; /* clear variant */
bytes[8] |= 0x80; /* set to IETF variant */
return constructType5UUID(bytes);
}
private static UUID constructType5UUID(byte[] data) {
long msb = 0;
long lsb = 0;
assert data.length == 16 : "data must be 16 bytes in length";
for (int i = 0; i < 8; i++)
msb = (msb << 8) | (data[i] & 0xff);
for (int i = 8; i < 16; i++)
lsb = (lsb << 8) | (data[i] & 0xff);
return new UUID(msb, lsb);
}
注意:名称空间标识符本身就是一个 UUID。
参考