到目前为止我尝试了什么
SELECT md5(text) will return text (hex strings) .
之后我们需要xor他们
SELECT x'hex_string' # x'hex_string';
但是上面的结果是二进制值。 如何将它们再次转换为十六进制字符串?
在postgresql中是否存在xor md5值并再次将其转换为十六进制值?
答案 0 :(得分:1)
那些二进制值实际上是bit varying
类型,与bytea
显着不同。
bit varying
内置了对XOR等的支持,但PostgreSQL不提供从bit varying
到bytea
的强制转换。
你可以编写一个执行强制转换的函数,但这不是一件容易的事情,可能不是你案例中更有效的方法。
直接对md5摘要进行XOR更有意义。 PostgreSQL也没有为bytea
提供XOR运算符,但它可以很容易地写入函数中,特别是假设操作数具有相等的长度(在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;
现在,生成十六进制字符串的内置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
答案 1 :(得分:0)