2012-02-29 10 views
12

Il JDK Sun/Oracle espone una funzione per creare un UUID di tipo 3 (basato sul nome) nel pacchetto java.util: java.util.UUID.nameUUIDFromBytes (nome byte []).Quale spazio dei nomi utilizza il JDK per generare un UUID con nameUUIDFromBytes?

I devono essere in grado di generare un UUID tipo 3 in Java utilizzando nameUUIDFromBytes e arrivare allo stesso UUID durante la creazione di un UUID tipo 3 in un'altra lingua, supponendo che forniscono lo stesso byte come sorgente.

In base ai javadocs, questa funzione crea un UUID di tipo 3 conforme a RFC 4122. Tuttavia, in base alla specifica RFC 4122, è necessario creare un UUID di tipo 3 all'interno di uno spazio dei nomi. La maggior parte delle altre lingue consente di specificare lo spazio dei nomi durante la creazione di un UUID di tipo 3 (ad esempio lo UUIDTools gem in Ruby).

Quindi la mia domanda è: quale UUID dello spazio dei nomi viene utilizzato da JDK quando invoco nameUUIDFromBytes?

+0

Il JDK utilizza internamente MD5 per la crittografia, anche se è consentito SHA-1 troppo, e anche preferito. Quindi da solo su quella scelta gli UUID potrebbero essere diversi. –

risposta

7

Vedi this bug report

Soprattutto il commento, in prossimità del fondo:

Forse il corso di azione a questo punto sarebbe quello di fissare il javadoc affermando "nameUUIDFromBytes (byte [] namespaceAndName)" uno dovrebbe passare un array di byte contenente la concatenazione dei byte UUID dello spazio dei nomi e dei byte del nome (in questo ordine) "Questo presuppone che il metodo solo MD5 sia il byte [] e imposta i campi come da documento IETF

Non so se mi fido di questo per funzionare correttamente, ma dovrebbe essere facile testare usando i nomi predefiniti dalla specifica UUID, confrontando con lo stesso UUID generato da qualche altra implementazione.

+0

Questo ha funzionato completamente. Grazie! –

+0

Wooohooo! Grazie per la conferma. – theglauber

1

Un codice di esempio:

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()); 
Problemi correlati