Подтвердить что ты не робот

Какое пространство имен использует JDK для создания UUID с именемUUIDFromBytes?

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

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

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

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

4b9b3361

Ответ 1

Смотрите этот отчет об ошибке

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

Возможно, на этом этапе действий будет исправлено утверждение javadoc "nameUUIDFromBytes (byte [] namespaceAndName)" нужно передать байтовый массив, содержащий конкатенацию байтов UUID пространства имен и байты имени (в этом порядке). "Предполагая, что метод просто MD5 является байтом [], и устанавливает поля как за документ IETF.

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

Ответ 2

Образец кода:

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