2

到目前为止我尝试过的

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

之后我们需要对它们进行异或

    SELECT x'hex_string'  # x'hex_string';

但是上面的结果是二进制值。如何再次将它们转换为十六进制字符串?

无论如何在postgresql中对md5值进行异或md5值并再次将其转换为十六进制值?

4

2 回答 2

1

这些二进制值实际上是类型bit varying,与bytea.

bit varying带有对 XOR 等的内置支持,但 PostgreSQL 不提供从bit varyingto的转换bytea

您可以编写一个执行强制转换的函数,但这并不是微不足道的,而且在您的情况下可能不是更有效的方法。

直接对 md5 摘要进行异或会更有意义。PostgreSQL 不提供 XOR 运算符bytea,但它可以很容易地写在一个函数中,特别是当假设操作数具有相等的长度(在 md5 摘要的情况下为 16 个字节)时:

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;

现在,生成十六进制字符串的内置 postgresqlmd5函数也不是最适合后处理的。该pgcrypto模块提供了此功能:

 digest(data text, type text) returns bytea

使用此函数并将最终结果作为十六进制字符串获取:

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

产生结果:c1bd61a3c411bc0127c6d7ab1238c4bd使用 type text

如果pgcrypto无法安装,只有内置md5功能可用,您仍然可以组合encodedecode达到这样的结果:

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

结果:

c1bd61a3c411bc0127c6d7ab1238c4bd

于 2013-07-20T17:06:03.730 回答
0

你可能想检查

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

我最近为这样的用例编写了这个 postgres 脚本。

于 2021-03-02T04:21:39.727 回答