Проблема с вашим методом Java в том, что он не включает пространство имен, требуемое UUID v3.Вам нужно добавить имя к имени перед вызовом UUID.nameUUIDFromBytes
:
private static final UUID NAMESPACE = UUID.fromString("00000000-0000-0000-0000-000000000000");
public static void main(String[] args) {
// Charset should match SERVER_ENCODING
System.out.println(uuidV3(NAMESPACE, "test".getBytes(StandardCharsets.UTF_8)));
}
public static UUID uuidV3(UUID namespace, byte[] name) {
byte[] ns = toBytes(namespace);
byte[] nsAndName = concatenate(ns, name);
return UUID.nameUUIDFromBytes(nsAndName);
}
public static byte[] concatenate(byte[] a, byte[] b) {
byte[] result = new byte[a.length + b.length];
System.arraycopy(a, 0, result, 0, a.length);
System.arraycopy(b, 0, result, a.length, b.length);
return result;
}
public static byte[] toBytes(UUID uuid) {
ByteBuffer buffer = ByteBuffer.wrap(new byte[16]);
buffer.putLong(uuid.getMostSignificantBits());
buffer.putLong(uuid.getLeastSignificantBits());
return buffer.array();
}
Я использовал пространство имен nil в приведенном выше примере, но это может быть что угодно.
Тествыше печатает
96e17d7a-ac89-38cf-95e1-bf5098da34e1
Что соответствует выводу эквивалентного запроса postgres:
select uuid_generate_v3(uuid_nil(), 'test');