2011-11-05 71 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提供的軟件包。