PostgreSQL:
create extension if not exists "uuid-ossp";
select uuid_generate_v3(uuid_nil(), 'this is a test');
uuid_generate_v3
--------------------------------------
e1e27115-9f5b-366d-90e8-e07b1b36b99c
(1 row)
Java:
java> java.util.UUID.nameUUIDFromBytes("this is a test".getBytes());
java.util.UUID res9 = 54b0c58c-7ce9-32a8-b551-351102ee0938
如何在 Java 中生成与 PostgreSQL 相同的 UUID?
此处描述了生成版本 3 UUID 的算法https://www.rfc-editor.org/rfc/rfc4122#section-4.3 https://www.rfc-editor.org/rfc/rfc4122#section-4.3
但关键步骤是:
- 分配一个 UUID 用作所有 UUID 的“名称空间 ID”
从该名称空间中的名称生成。
- 选择 MD5 或 SHA-1 作为哈希算法
- 将名称转换为规范的八位位组序列
- 计算名称空间 ID 与名称连接的哈希值。
- 将 的某些字节更改为预定义值(请参阅上面的链接)
- 将生成的 UUID 转换为本地字节顺序。
postgres 函数签名是uuid_generate_v3(namespace uuid, name text)
所以它需要命名空间 UUID 和name
作为参数。
Java方法nameUUIDFromBytes(byte[] name)
仅需要name
并使用 MD5 对其进行哈希处理以创建 UUID。要获得与 PostgreSQL 相同的输出,您必须连接命名空间字节和name
自己拼凑字节。
对于您使用过的命名空间uuid_nil()
(全零)这是new UUID(0L, 0L)
在爪哇。
把它们放在一起看起来像这样:
byte[] bytes = Arrays.concatenate(toByteArray(new UUID(0L, 0L)), "this is a test".getBytes(StandardCharsets.UTF_8));
System.out.println(UUID.nameUUIDFromBytes(bytes)); // prints out e1e27115-9f5b-366d-90e8-e07b1b36b99c
您可以将命名空间 UUID 转换为字节数组,如下所示:
private static byte[] toByteArray(UUID uuid) {
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(uuid.getMostSignificantBits());
bb.putLong(uuid.getLeastSignificantBits());
return bb.array();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)