The Sun/Oracle JDK exposes a function to create a type 3 (name based) UUID in the java.util package: java.util.UUID.nameUUIDFromBytes(byte[] name).
I need to be able to generate a type 3 UUID in Java using nameUUIDFromBytes and arrive at the same UUID when creating a type 3 UUID in another language, assuming I provide the same bytes as the source.
According to the javadocs this function creates a RFC 4122 compliant type 3 UUID. However, according to the RFC 4122 spec, a type 3 UUID must be created within some namespace. Most other languages allow you specify the namespace when creating a type 3 UUID (e.g. the UUIDTools gem in Ruby).
So my question is: what namespace UUID is used by the JDK when I invoke nameUUIDFromBytes?
See this bug report
Especially the comment, near the bottom:
Perhaps the course of action at this point would be to fix the javadoc stating
"nameUUIDFromBytes(byte[] namespaceAndName) "one should pass-in a byte array containing the concatenation of the namespace UUID's bytes and the name bytes (in that order)" That's assuming the method just MD5's the byte[] and sets the fields as per the IETF document.
I don't know if i trust this to work correctly, but it should be easy to test using the predefined namespeces from the UUID spec, comparing with same UUID generated by some other implementation.
A Sample Code:
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());