更快的哈希与更少的冲突?

时间:2011-11-05 03:17:57

标签: sql oracle plsql ora-hash

当总计一列的所有行(1000万)的散列(可能是NUMBER,VARCHAR,DATE,TIMESTAMP但是,哪种形式的散列将返回最快的结果(并且2个结果返回相同散列的概率最小))没有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 个答案:

答案 0 :(得分:4)

哪种方法更快?

我没有替补标记这一点,但我猜想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提供的包。