我有一些表,我想获得每一行的哈希值(该列可以是任何日期类型)。每个表可能有不同的模式。以下是测试。将Oracle行序列化为字符串并获取其散列值?
select *,
get_sha1_hash(a, b, c, x) Hash -- Get the Sha1 hash of columns a, b, c, x
from (
select 1 a, 2 b, 3.1 c, 'aa' x from dual union all
select 4 a, 5 b, 6.3 c, 'bb' from dual union all
select 1 a, 2 b, 9.9 c, 'cc' from dual) t
如何实施get_sha1_hash
?以下是否足够好?
select ora_hash(a || b || c || x) from t
连接最多可处理32768个字符(max varchar2)。另外,我不确定你在问什么,但要清楚说明'ORA_HASH'不是'SHA1'哈希。如果你想要SHA1,你应该使用DBMS_CRYPTO;请参阅:https://stackoverflow.com/questions/1749753/making-a-sha1-hash-of-a-row-in-oracle – kfinity
我想使用SHA1。但是,如果足够好,我可以使用ORA_hash。我将需要通过比较哈希代码来监视每日更改。 – ca9163d9
ORA_HASH是一个32位散列函数,所以一旦你得到约9000个独特的行,你将有大约1%的碰撞几率。 SHA1是160位的,所以即使有数十亿行,你的碰撞几率也很小。所以是的,这取决于你的情况。 – kfinity