作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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
但关键步骤是:
postgres 函数签名是 uuid_generate_v3(namespace uuid, name text)
所以它以命名空间 UUID 和 name
作为参数。
Java 方法 nameUUIDFromBytes(byte[] name)
仅采用 name
并使用 MD5 对其进行哈希处理以创建 UUID。要获得与 PostgreSQL 相同的输出,您必须自己将命名空间字节和 name
字节连接在一起。
对于命名空间,您使用了 uuid_nil()
(全为零),它是 Java 中的 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();
}
关于java - 如何在 Java 中复制 PostgreSQL 的 uuid_generate_v3()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40616100/
我是一名优秀的程序员,十分优秀!