выберите sha256 расшифровывать и конвертировать md5 в postgresql и java

2

Добрый день, мне нужно преобразовать UUID в sha256, а затем в md5, в java это сработало, но если я сделаю это с помощью pgadmin (postgres), то 1 символ отличается

в java

public class outro {

public static void main(String[] args) {
    String prontuarioBaseUUID = "a1d347fc-094f-49de-91b9-f2765c58b94d";
    System.out.println(uuidSha2Encrypt(prontuarioBaseUUID));

}

public static String uuidSha2Encrypt(String uuid) {
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(uuid.getBytes());
        return UUID.nameUUIDFromBytes(md.digest()).toString();
    } catch (NoSuchAlgorithmException ns) {
        throw new RuntimeException("Algoritmo SHA-256 não disponível", ns);
    }
}

результат d5fabb45-dbd1-399b-a6c1-515367b8a2d4

в pgadmin postgres

выберите uuid_in (md5 (дайджест ('a1d347fc-094f-49de-91b9-f2765c58b94d', 'sha256')) :: cstring) от tb_paciente

результат d5fabb45-dbd1-b99b-a6c1-515367b8a2d4

что проблема? спасибоx

  1. d5fabb45-dbd1- 399b -a6c1-515367b8a2d4
  2. d5fabb45-dbd1- b99b -a6c1-515367b8a2d4
  • 0
    Это происходит потому, что ваш запрос не устанавливает флаги версии и варианта UUID в значения v3. В uuid_generate_v3 uuid-ossp есть uuid_generate_v3, но он принимает пространство имен в качестве аргумента. Что именно вы пытаетесь достичь?
  • 0
    я использую uuid_generate_v3, uuid_generate_v5 и все пространство имен uuid_nil, uuid_ns_dns, uuid_ns_url, uuid_ns_oid, uuid_ns_x500 и не работают со всеми различными UUID :( ВЫБРАТЬ uuid_generate_g3-ru-566 «)));
Теги:
sha256
md5

1 ответ

4

Там проблема с вашим Java-методом заключается в том, что он не включает пространство имен, необходимое UUID v3. Перед вызовом UUID.nameUUIDFromBytes необходимо добавить пространство имен к имени:

private static final UUID NAMESPACE = UUID.fromString("00000000-0000-0000-0000-000000000000");

public static void main(String[] args) {
    // Charset should match SERVER_ENCODING
    System.out.println(uuidV3(NAMESPACE, "test".getBytes(StandardCharsets.UTF_8)));
}

public static UUID uuidV3(UUID namespace, byte[] name) {
    byte[] ns = toBytes(namespace);
    byte[] nsAndName = concatenate(ns, name);
    return UUID.nameUUIDFromBytes(nsAndName);
}

public static byte[] concatenate(byte[] a, byte[] b) {
    byte[] result = new byte[a.length + b.length];
    System.arraycopy(a, 0, result, 0, a.length);
    System.arraycopy(b, 0, result, a.length, b.length);
    return result;
}

public static byte[] toBytes(UUID uuid) {
    ByteBuffer buffer = ByteBuffer.wrap(new byte[16]);
    buffer.putLong(uuid.getMostSignificantBits());
    buffer.putLong(uuid.getLeastSignificantBits());
    return buffer.array();
}

Я использовал пространство имен nil в приведенном выше примере, но это может быть что угодно.

Тест выше распечатывается

96e17d7a-ac89-38cf-95e1-bf5098da34e1

Что соответствует выходу эквивалентного запроса postgres:

select uuid_generate_v3(uuid_nil(), 'test');

Ещё вопросы

Сообщество Overcoder
Наверх
Меню