どちらの方法が速いですか?
私はこれをベンチマークしていませんが、DBMS_SQLHASHはこのタイプの問題のために正確に構築されているため、最速だと思います。
これは公式パッケージですが、セキュリティには十分に文書化されていません。ガイド
。 5,964(!)ページ PL/SQLパッケージおよびタイプリファレンス<にはありません。 / a> 、およびgrant execute on dbms_sqlhash to [user];
に付与する必要があります。 それが機能するためには、おそらくそれがほとんど誰もそれを聞いたことがない理由です。
例:
select sys.DBMS_SQLHASH.GETHASH(sqltext=>'select 1 from dual', digest_type=>1)
from dual;
ダイジェストタイプ:1 =HASH_MD4、2 =HASH_MD5、3 =HASH_SH1
衝突の可能性
衝突の可能性についていくつか質問があります:ハッシュ衝突-チャンスは何ですか? 、2つの異なる文字列を使用できます同じMD5ハッシュコードを生成しますか?
多くの行を合計し始めたときにどうなるかは正確にはわかりませんが、1回の衝突の可能性は非常に低いため、おそらく問題ありません。
数学はわかりませんが、独自の関数を作成しようとすると、衝突の原因として最も可能性が高いのはプログラミングエラーであると確信しています。
私はこのようなスクリプトを見て構築しましたが、それを台無しにする微妙な方法はたくさんあります。たとえば、null値と行または列間の値の交換。現在使用している列は1つだけですが、誰かがこれらの醜いスクリプトの1つを記述しないようにするには、可能な限りOracleが提供するパッケージを使用する必要があります。