gpt4 book ai didi

postgresql - 如何对 md5 哈希值进行异或并将它们转换为 postgresql 中的 HEX

转载 作者:行者123 更新时间:2023-11-29 12:21:56 33 4
gpt4 key购买 nike

到目前为止我尝试了什么

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

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

    SELECT x'hex_string'  # x'hex_string';

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

有没有办法在 postgresql 中对 md5 值进行 xor 运算并再次将其转换为十六进制值?

最佳答案

那些二进制值实际上是bit varying类型,这与bytea有很大不同。

bit varying 内置了对 XOR 等的支持,但 PostgreSQL 不提供从 bit varyingbytea 的转换.

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

直接异或 md5 摘要会更有意义。 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解码得到这样的结果:

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

结果:

c1bd61a3c411bc0127c6d7ab1238c4bd

关于postgresql - 如何对 md5 哈希值进行异或并将它们转换为 postgresql 中的 HEX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17739887/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com