2011-11-05 68 views
2

当总结一列的所有行(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; 
/

回答

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?

我不确定究竟是什么hap当你开始总结许多行时,笔会有机会,但是单次碰撞的可能性非常低,以至于你可能没问题。

我不知道数学,但我相信碰撞的最可能原因是编程错误,如果你尝试编写自己的函数。

我已经看到并构建了像这样的脚本,并且有很多微妙的方法来解决它。例如,空值和交换行或列之间的值。即使您现在只使用一列,为了防止有人写出其中一个丑陋的脚本,您应该尽可能使用Oracle提供的软件包。