Как 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 для такого варианта использования.