2

1 つの列 (NUMBER、VARCHAR、DATE、TIMESTAMP の可能性がありますが、CLOB はありません。 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

1 に答える 1

4

どちらの方法が速いですか?

私はこれをベンチマークしていませんが、DBMS_SQLHASHはこのタイプの問題のために正確に構築されているため、最速だと思います。

これは公式パッケージですが、セキュリティガイドには十分に文書化されていません。これは、5,964(!)ページのPL / SQLパッケージおよびタイプのリファレンスには含まれていません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

衝突の可能性

衝突の可能性についていくつかの質問があります:ハッシュ衝突-可能性は何ですか?2つの異なる文字列で同じMD5ハッシュコードを生成できますか?

多くの行を合計し始めたときにどうなるかは正確にはわかりませんが、1回の衝突の可能性は非常に低いため、おそらく大丈夫です。

数学はわかりませんが、独自の関数を作成しようとすると、衝突の原因として最も可能性が高いのはプログラミングエラーであると確信しています。

私はこのようなスクリプトを見て構築しましたが、それを台無しにする微妙な方法はたくさんあります。たとえば、null値と行または列間の値の交換。現在使用している列は1つだけですが、誰かがこれらの醜いスクリプトの1つを記述しないようにするには、可能な限りOracleが提供するパッケージを使用する必要があります。

于 2011-11-05T04:56:11.287 に答える