Qual método é mais rápido?
Eu não marquei isso, mas acho que DBMS_SQLHASH é o mais rápido, já que foi construído exatamente para esse tipo de problema.
É um pacote oficial, mas não está bem documentado no Segurança Guia . Não está na página 5.964(!) Referência de tipos e pacotes PL/SQL , e você precisa
grant execute on dbms_sqlhash to [user];
para que funcione, provavelmente é por isso que quase ninguém ouviu falar dele. Por exemplo:
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
Probabilidade de colisão
Há algumas perguntas sobre as chances de uma colisão:Hash Collision - quais são as chances? , Pode duas strings diferentes gerar o mesmo código hash MD5?
Não sei exatamente o que acontece com a chance quando você começa a somar muitas linhas, mas as chances de uma única colisão são tão ridiculamente baixas que você provavelmente está bem.
Não sei matemática, mas tenho certeza de que a causa mais provável de uma colisão é um erro de programação se você tentar escrever sua própria função.
Eu vi e construí scripts assim, e há muitas maneiras sutis de estragar tudo. Por exemplo, valores nulos e valores de troca entre linhas ou colunas. Mesmo que você esteja usando apenas uma coluna agora, para evitar que alguém escreva um desses scripts feios, você deve usar o pacote fornecido pela Oracle sempre que possível.