计算PostgreSQL中BLOB字段的校验和/哈希值

时间:2013-07-05 07:42:49

标签: postgresql hash

我需要检查参数的哈希值是否等于PostgreSQL中列的哈希值。 在oracle中,我使用以下代码来执行此操作

ORA_HASH(utl_raw.cast_to_varchar2(dbms_lob.substr(BlobField,2000,1))) <> ORA_HASH(utl_raw.cast_to_varchar2(dbms_lob.substr(:BlobField,2000,1)))
  

我使用前2000个字节只是因为Oracle的ORA_HASH函数有限制,这对于PostgreSQL实现不需要

PostgreSQL中有什么相同的东西吗?

1 个答案:

答案 0 :(得分:2)

regress=> SELECT md5('blah blah');
               md5                
----------------------------------
 ae661d08d1ca1576a6efcb82b7bc502f
(1 row)

这也适用于bytea字段:

regress=> SELECT md5(BYTEA '\x000102');
               md5                
----------------------------------
 b95f67f61ebb03619622d798f45fc2d3
(1 row)

BYTEA '\x000102'只是该示例的bytea文字。您通常只需编写md5(the_column),它对文本和bytea都可以正常工作。

在任何真正的测试当然,你总是写:

SELECT blah, blah2
FROM tablename
WHERE md5(fieldname) = 'ae661d08d1ca1576a6efcb82b7bc502f' 
  AND fieldname = 'blah blah';

因为校验和本质上存在风险冲突,但不太可能。通常情况下,您在md5(fieldname)上有一个索引,因此您可以大大减少全场比较的数量,例如:

CREATE INDEX sometable_somefield_md5 ON sometable((md5(somefield));