Какое пространство имен использует JDK для генерации UUID с nameUUIDFromBytes? - PullRequest
12 голосов
/ 29 февраля 2012

Sun / Oracle JDK предоставляет функцию для создания UUID типа 3 (на основе имени) в пакете java.util: java.util.UUID.nameUUIDFromBytes (имя байта []).

Мне нужночтобы иметь возможность генерировать UUID типа 3 в Java с использованием nameUUIDFromBytes и получать тот же UUID при создании UUID типа 3 на другом языке, предполагая, что я предоставляю те же байты, что и источник.

В соответствии с javadocs эта функция создает UUID типа 3, совместимый с RFC 4122.Однако согласно спецификации RFC 4122 в некотором пространстве имен должен быть создан UUID типа 3.Большинство других языков позволяют указывать пространство имен при создании UUID типа 3 (например, UUIDTools gem в Ruby).

Итак, мой вопрос: какое UUID пространства имен используется JDK, когда я вызываю nameUUIDFromBytes?

Ответы [ 2 ]

7 голосов
/ 29 февраля 2012

См. отчет об ошибке

Особенно комментарий, внизу:

Возможно, на этом этапе можно было бы исправить формулировку Javadoc. «nameUUIDFromBytes (byte [] namespaceAndName)» необходимо передать байтовый массив, содержащий конкатенацию байтов UUID пространства имен и байтов имени (в этом порядке). согласно документу IETF.

Я не знаю, доверяю ли я тому, чтобы это работало правильно, но это должно быть легко проверить с использованием предопределенных имен из спецификации UUID по сравнению с тем же UUID, сгенерированным какой-то другой реализацией.

1 голос
/ 30 октября 2012

Код образца:

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());
...