Кой метод е по-бърз?
Не съм отбелязал това, но бих предположил, че DBMS_SQLHASH е най-бързият, тъй като е създаден точно за този тип проблеми.
Това е официален пакет, но не е добре документиран в Сигурност Ръководство
. Не е в страницата с 5964(!) Справочник за 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
Възможност от сблъсък
Има някои въпроси относно шансовете за сблъсък:Хеш сблъсък - какви са шансовете? , Могат ли два различни низа генериране на същия MD5 хеш код?
Не съм сигурен точно какво се случва с шанса, когато започнете да сумирате много редове, но шансовете за един сблъсък са толкова абсурдно ниски, че вероятно сте добре.
Не разбирам математиката, но съм сигурен, че най-вероятната причина за сблъсък е грешка в програмирането, ако се опитате да напишете своя собствена функция.
Виждал съм и създавам скриптове точно като този и има много фини начини да го прецакате. Например нулеви стойности и размяна на стойности между редове или колони. Въпреки че сега използвате само една колона, за да попречите на някой да напише някой от тези грозни скриптове, трябва да използвате пакета, предоставен от Oracle, когато е възможно.