Как XOR md5 хэш-значения и привести их к HEX в postgresql

Что я пробовал до сих пор

     SELECT md5(text) will return text (hex strings) .

После этого нам нужно их xor

    SELECT x'hex_string'  # x'hex_string';

Но вышеупомянутое приводит к двоичным значениям. Как мне снова преобразовать их в шестнадцатеричную строку?

Есть ли в любом случае xor md5 значения в postgresql и снова преобразовать это в шестнадцатеричные значения?

2 ответа

Решение

Эти двоичные значения на самом деле типа bit varying, который значительно отличается от bytea,

bit varying поставляется со встроенной поддержкой XOR и тому подобного, но PostgreSQL не предоставляет приведение от bit varying в bytea,

Вы могли бы написать функцию, которая выполняет приведение, но это не тривиально и, вероятно, не самый эффективный способ в вашем случае.

Было бы логичнее напрямую XOR для дайджеста md5. PostgreSQL не предоставляет оператор XOR для bytea либо, но это может быть легко написано в функции, особенно если предположить, что операнды имеют равную длину (16 байтов в случае дайджестов md5):

CREATE FUNCTION xor_digests(_in1 bytea, _in2 bytea) RETURNS bytea
AS $$
DECLARE
 o int; -- offset
BEGIN
  FOR o IN 0..octet_length(_in1)-1 LOOP
    _in1 := set_byte(_in1, o, get_byte(_in1, o) # get_byte(_in2, o));
  END LOOP;
 RETURN _in1;
END;
$$ language plpgsql;

Теперь встроенный postgresql md5 Функция, которая создает шестнадцатеричную строку, также не подходит для последующей обработки. pgcrypto Модуль предоставляет эту функцию вместо:

 digest(data text, type text) returns bytea

Используя эту функцию и получая конечный результат в виде шестнадцатеричной строки:

   select encode(
          xor_digest ( digest('first string', 'md5') ,
                       digest('second string', 'md5')),
          'hex');

выдает результат: c1bd61a3c411bc0127c6d7ab1238c4bd с типом text,

Если pgcrypto не может быть установлен и только встроенный md5 функция доступна, вы все еще можете объединить encode а также decode чтобы достичь результата, как это:

select
encode(
 xor_digest(
   decode(md5('first string'), 'hex'),
   decode(md5('second string'), 'hex')
 ),
 'hex'
);

Результат:

c1bd61a3c411bc0127c6d7ab1238c4bd

Вы можете проверить

https://github.com/artejera/text_xor_agg/

Недавно я написал этот скрипт postgres для такого варианта использования.

Другие вопросы по тегам