1

我需要检查参数的哈希值是否等于 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中有什么等价的吗?

4

1 回答 1

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));
于 2013-07-05T07:45:08.223 回答