我需要检查一个参数的哈希是否等于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中有类似的东西吗?
regress=> SELECT md5('blah blah');
md5
----------------------------------
ae661d08d1ca1576a6efcb82b7bc502f
(1 row)
这也适用于bytea
字段:
regress=> SELECT md5(BYTEA 'x000102');
md5
----------------------------------
b95f67f61ebb03619622d798f45fc2d3
(1 row)
BYTEA 'x000102'
只是示例中的一个字节文字。您通常只需编写md5(the_column)
,它对文本和字节都能很好地工作。
当然,在任何真正的测试中,你都会写:
SELECT blah, blah2
FROM tablename
WHERE md5(fieldname) = 'ae661d08d1ca1576a6efcb82b7bc502f'
AND fieldname = 'blah blah';
因为校验和本质上会有冲突的风险,不管这种可能性有多小。通常情况下,md5(fieldname)
上会有一个索引,因此可以大大减少进行的全字段比较的数量,例如:
CREATE INDEX sometable_somefield_md5 ON sometable((md5(somefield));