sql >> Database >  >> RDS >> Oracle

Snellere hash met minder botsingen?

Welke methode is sneller?

Ik heb dit niet gecontroleerd, maar ik vermoed dat DBMS_SQLHASH de snelste is, omdat het precies voor dit soort problemen is gebouwd.

Het is een officieel pakket, maar niet goed gedocumenteerd in de Beveiliging Gids . Het staat niet op de 5.964(!) pagina PL/SQL-pakketten en -types Reference , en je moet grant execute on dbms_sqlhash to [user]; om het te laten werken, is dat waarschijnlijk de reden waarom bijna niemand ervan heeft gehoord.

Bijvoorbeeld:

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

Kans op een aanrijding

Er zijn enkele vragen over de kans op een botsing:Hash Collision - wat zijn de kansen? , Kan twee verschillende strings dezelfde MD5-hashcode genereren?

Ik weet niet precies wat er gebeurt met de kans als je veel rijen begint op te tellen, maar de kans op een enkele botsing is zo belachelijk laag dat je waarschijnlijk in orde bent.

Ik ken de wiskunde niet, maar ik weet zeker dat de meest waarschijnlijke oorzaak van een botsing een programmeerfout is als je je eigen functie probeert te schrijven.

Ik heb scripts zoals deze gezien en gebouwd, en er zijn veel subtiele manieren om het te verknoeien. Bijvoorbeeld null-waarden en het wisselen van waarden tussen rijen of kolommen. Ook al gebruik je nu maar één kolom, om te voorkomen dat iemand ooit een van die lelijke scripts schrijft, moet je waar mogelijk het door Oracle geleverde pakket gebruiken.




  1. Hoe gebruik je reguliere expressie in sql-server?

  2. Sqlplus-fout detecteren in dos batch-script?

  3. Java SSH MySQL-verbinding

  4. Hoe maak ik tabellen die geen eigendom zijn van sys in Oracle?