Která metoda je rychlejší?
Neoznačil jsem to na benchmarku, ale tipl bych si, že DBMS_SQLHASH je nejrychlejší, protože byl vytvořen přesně pro tento typ problému.
Je to oficiální balíček, ale není dobře zdokumentován v Security Průvodce
. Není to na stránce 5 964(!) Referenční informace o balíčcích a typech PL/SQL a musíte grant execute on dbms_sqlhash to [user];
aby to fungovalo, pravděpodobně proto o tom téměř nikdo neslyšel.
Například:
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
Možnost kolize
Existuje několik otázek ohledně pravděpodobnosti kolize:Hash Collision - jaké jsou šance? , Můžou být dva různé řetězce vygenerovat stejný hash kód MD5?
Nevím přesně, co se stane s pravděpodobností, když začnete sčítat mnoho řádků, ale šance na jedinou kolizi jsou tak směšně nízké, že jste pravděpodobně v pořádku.
Neovládám matematiku, ale jsem si jistý, že nejpravděpodobnější příčinou kolize je chyba programování, pokud se pokusíte napsat svou vlastní funkci.
Viděl jsem a sestavoval skripty přesně jako tento a existuje mnoho rafinovaných způsobů, jak to podělat. Například hodnoty null a prohození hodnot mezi řádky nebo sloupci. I když nyní používáte pouze jeden sloupec, abyste zabránili tomu, aby někdo napsal jeden z těch ošklivých skriptů, měli byste použít balíček dodaný Oracle, kdykoli je to možné.