JDK使用什么命名空间来生成名称为UUIDFromBytes的UUID?

Sun / Oracle JDK公开了一个函数,用于在java.util包中创建类型3(基于名称)的UUID:java.util.UUID.nameUUIDFromBytes(byte [] name)。

我需要能够使用nameUUIDFromBytes在Java中生成类型3 UUID,并在使用另一种语言创建类型3 UUID时获得相同的UUID,假设我提供与源相同的字节。

根据javadocs,此函数创建符合RFC 4122的类型3 UUID。 但是,根据RFC 4122规范,必须在某个名称空间中创建类型3 UUID。 大多数其他语言允许您在创建类型3 UUID时指定命名空间(例如Ruby中的UUIDTools gem )。

所以我的问题是:当我调用nameUUIDFromBytes时,JDK使用了什么命名空间UUID?

请参阅此错误报告

特别是评论,靠近底部:

也许此时的行动方针是修复javadoc,声明“nameUUIDFromBytes(byte [] namespaceAndName)”应该传入包含命名空间UUID的字节和名称字节(按此顺序)的串联的字节数组“这假设方法只是MD5的byte []并根据IETF文档设置字段。

我不知道我是否相信这可以正常工作,但是应该很容易使用UUID规范中的预定义名称进行测试,并与其他实现生成的相同UUID进行比较。

示例代码:

String NameSpace_OID_string = "6ba7b812-9dad-11d1-80b4-00c04fd430c8"; UUID NameSpace_OID_uuid = UUID.fromString(NameSpace_OID_string); long msb = NameSpace_OID_uuid.getMostSignificantBits(); long lsb = NameSpace_OID_uuid.getLeastSignificantBits(); byte[] NameSpace_OID_buffer = new byte[16]; for (int i = 0; i < 8; i++) { NameSpace_OID_buffer[i] = (byte) (msb >>> 8 * (7 - i)); } for (int i = 8; i < 16; i++) { NameSpace_OID_buffer[i] = (byte) (lsb >>> 8 * (7 - i)); } String name = "user123"; byte[] name_buffer = name.getBytes(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream( ); try { outputStream.write( NameSpace_OID_buffer); outputStream.write( name_buffer ); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } byte byteArray[] = outputStream.toByteArray(); System.out.println(UUID.nameUUIDFromBytes(byteArray).toString());