如何在postgresql中对md5哈希值进行异或运算并将其转换为十六进制

如何在postgresql中对md5哈希值进行异或运算并将其转换为十六进制,postgresql,cryptography,md5,xor,md5sum,Postgresql,Cryptography,Md5,Xor,Md5sum,到目前为止我都试过了 SELECT md5(text) will return text (hex strings) . 然后我们需要对它们进行异或运算 SELECT x'hex_string' # x'hex_string'; 但是上面的结果是二进制值。 如何再次将它们转换为十六进制字符串 postgresql中是否有xor md5值并再次将其转换为十六进制值?这些二进制值实际上是位变的类型,这与bytea有很大不同 位变化内置了对XOR等的支持,但PostgreSQL

到目前为止我都试过了

     SELECT md5(text) will return text (hex strings) .
然后我们需要对它们进行异或运算

    SELECT x'hex_string'  # x'hex_string';
但是上面的结果是二进制值。 如何再次将它们转换为十六进制字符串

postgresql中是否有xor md5值并再次将其转换为十六进制值?

这些二进制值实际上是位变的
类型,这与
bytea
有很大不同

位变化
内置了对XOR等的支持,但PostgreSQL不提供从
位变化
字节转换

您可以编写一个执行强制转换的函数,但这并不是一件小事,在您的情况下可能不是更有效的方法

直接对md5摘要进行异或更有意义。PostgreSQL也没有为
bytea
提供XOR运算符,但它可以很容易地写入函数中,特别是假设操作数的长度相等(md5摘要为16字节):

现在,生成十六进制字符串的内置postgresql
md5
函数也不是最适合后处理的。模块提供以下功能:

 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

你可能想检查一下


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

谢谢。威尔考虑在postgresql中使用md5_agg()。请查收
select
encode(
 xor_digest(
   decode(md5('first string'), 'hex'),
   decode(md5('second string'), 'hex')
 ),
 'hex'
);