更快的哈希和更少的冲突?
Posted
技术标签:
【中文标题】更快的哈希和更少的冲突?【英文标题】:Faster hash with less collisions? 【发布时间】:2011-11-05 03:17:57 【问题描述】:当对一列(可能是 NUMBER、VARCHAR、DATE、TIMESTAMP 但没有 CLOBS、XML.etc)?然后将该值与另一个表上的相同操作进行比较,以检查同一列的所有行是否完全相同。
SET SERVEROUTPUT ON
DECLARE
HASH_VAL NUMBER;
begin
DBMS_OUTPUT.PUT_LINE (OWA_OPT_LOCK.CHECKSUM('column_here'));
DBMS_OUTPUT.PUT_LINE (DBMS_UTILITY.GET_HASH_VALUE('column_here',1,POWER(2,31)-1));
EXECUTE IMMEDIATE 'SELECT ORA_HASH(''column_here'') FROM DUAL' INTO HASH_VAL;
DBMS_OUTPUT.PUT_LINE (HASH_VAL);
DBMS_OUTPUT.PUT_LINE (DBMS_OBFUSCATION_TOOLKIT.MD5( INPUT_STRING => 'column_here'));
DBMS_OUTPUT.PUT_LINE ( DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW('column_here'),3) );
END;
/
【问题讨论】:
【参考方案1】:哪种方法更快?
我没有对这个进行基准测试,但我猜 DBMS_SQLHASH 是最快的,因为它正是为此类问题而构建的。
这是一个官方包,但在Security Guide 中没有很好的记录。它不在 5,964(!) 页面 PL/SQL Packages and Types Reference 中,您需要 grant execute on dbms_sqlhash to [user];
才能使其工作,这可能就是几乎没有人拥有的原因
听说过。
例如:
select sys.DBMS_SQLHASH.GETHASH(sqltext=>'select 1 from dual', digest_type=>1)
from dual;
digest_type: 1 = HASH_MD4, 2 = HASH_MD5, 3 = HASH_SH1
发生碰撞的可能性
有一些关于碰撞几率的问题:Hash Collision - what are the chances?、Can two different strings generate the same MD5 hash code?
我不确定当你开始对多行求和时会发生什么,但是一次碰撞的可能性非常低,你可能没问题。
我不知道数学,但我确信如果您尝试编写自己的函数,最可能的冲突原因是编程错误。
我已经看到并构建了这样的脚本,并且有许多巧妙的方法可以搞砸它。例如,空值和行或列之间的交换值。即使您现在只使用一列,为了防止有人编写其中一个丑陋的脚本,您应该尽可能使用 Oracle 提供的包。
【讨论】:
以上是关于更快的哈希和更少的冲突?的主要内容,如果未能解决你的问题,请参考以下文章