Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Hash mais rápido com menos colisões?


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.