Oracle
 sql >> Base de données >  >> RDS >> Oracle

Hachage plus rapide avec moins de collisions ?

Quelle méthode est la plus rapide ?

Je n'ai pas noté cela, mais je suppose que DBMS_SQLHASH est le plus rapide, car il a été construit exactement pour ce type de problème.

C'est un package officiel, mais pas bien documenté dans la Sécurité Guide . Ce n'est pas dans la page 5,964(!) PL/SQL Packages and Types Reference , et vous devez grant execute on dbms_sqlhash to [user]; pour que cela fonctionne, c'est probablement pourquoi presque personne n'en a entendu parler.

Par exemple :

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

Risque de collision

Il y a quelques questions sur les chances d'une collision :Hash Collision - quelles sont les chances ? , Peut-on utiliser deux chaînes différentes générer le même code de hachage MD5 ?

Je ne sais pas exactement ce qu'il advient de la chance lorsque vous commencez à additionner plusieurs lignes, mais les chances d'une seule collision sont si ridiculement faibles que vous n'avez probablement rien à craindre.

Je ne connais pas les calculs, mais je suis sûr que la cause la plus probable d'une collision provient d'une erreur de programmation si vous essayez d'écrire votre propre fonction.

J'ai vu et construit des scripts comme celui-ci, et il existe de nombreuses façons subtiles de le gâcher. Par exemple, les valeurs nulles et les valeurs d'échange entre les lignes ou les colonnes. Même si vous n'utilisez qu'une seule colonne maintenant, pour empêcher quelqu'un d'écrire un de ces scripts laids, vous devez utiliser le package fourni par Oracle chaque fois que possible.