UUID.nameUUIDFromBytes()
方法
不使用命名空间生成 UUID v3。它只是使用 MD5 哈希运算处理 'name'。
你需要手动将命名空间字节(16 字节)与 'name' 字节连接起来,然后再调用
UUID.nameUUIDFromBytes()
方法。下面的两个示例使用
ByteBuffer
和
System.arraycopy()
在调用
UUID.nameUUIDFromBytes()
之前连接 'namespace' 和 'name'。
使用 'ByteBuffer' 的示例
package com.example;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.UUID;
public class Example1 {
public static UUID getNameBased(UUID namespace, String name) {
final byte[] nameBytes = name.getBytes(StandardCharsets.UTF_8);
ByteBuffer buffer = ByteBuffer.allocate(nameBytes.length + 16);
buffer.putLong(namespace.getMostSignificantBits());
buffer.putLong(namespace.getLeastSignificantBits());
buffer.put(nameBytes);
return UUID.nameUUIDFromBytes(buffer.array());
}
public static void main(String[] args) {
UUID namespace = UUID.fromString("11111111-2222-3333-4444-555555555555");
String name = "this is a test";
UUID uuid = getNameBased(namespace, name);
System.out.println(uuid);
}
}
使用 'System.arraycopy()' 的示例
package com.example;
import java.nio.charset.StandardCharsets;
import java.util.UUID;
public class Example2 {
public static UUID getNameBased(UUID namespace, String name) {
final byte[] msb = toBytes(namespace.getMostSignificantBits());
final byte[] lsb = toBytes(namespace.getLeastSignificantBits());
final byte[] nam = name.getBytes(StandardCharsets.UTF_8);
final byte[] bytes = new byte[16 + nam.length];
System.arraycopy(msb, 0, bytes, 0, 8);
System.arraycopy(lsb, 0, bytes, 8, 8);
System.arraycopy(nam, 0, bytes, 16, nam.length);
return UUID.nameUUIDFromBytes(bytes);
}
private static byte[] toBytes(final long number) {
return new byte[] { (byte) (number >>> 56), (byte) (number >>> 48), (byte) (number >>> 40),
(byte) (number >>> 32), (byte) (number >>> 24), (byte) (number >>> 16), (byte) (number >>> 8),
(byte) (number) };
}
public static void main(String[] args) {
UUID namespace = UUID.fromString("11111111-2222-3333-4444-555555555555");
String name = "this is a test";
UUID uuid = getNameBased(namespace, name);
System.out.println(uuid);
}
}
库
有两个库可以使用命名空间生成UUID v3和v5: