到目前为止我尝试过的
SELECT md5(text) will return text (hex strings) .
之后我们需要对它们进行异或
SELECT x'hex_string' # x'hex_string';
但是上面的结果是二进制值。如何再次将它们转换为十六进制字符串?
无论如何在postgresql中对md5值进行异或md5值并再次将其转换为十六进制值?
到目前为止我尝试过的
SELECT md5(text) will return text (hex strings) .
之后我们需要对它们进行异或
SELECT x'hex_string' # x'hex_string';
但是上面的结果是二进制值。如何再次将它们转换为十六进制字符串?
无论如何在postgresql中对md5值进行异或md5值并再次将其转换为十六进制值?
这些二进制值实际上是类型bit varying
,与bytea
.
bit varying
带有对 XOR 等的内置支持,但 PostgreSQL 不提供从bit varying
to的转换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
功能可用,您仍然可以组合encode
并decode
达到这样的结果:
select
encode(
xor_digest(
decode(md5('first string'), 'hex'),
decode(md5('second string'), 'hex')
),
'hex'
);
结果:
c1bd61a3c411bc0127c6d7ab1238c4bd