Oracle
 sql >> Database >  >> RDS >> Oracle

Hash più veloce con meno collisioni?

Quale metodo è più veloce?

Non l'ho segnato al banco, ma suppongo che DBMS_SQLHASH sia il più veloce, poiché è stato creato esattamente per questo tipo di problema.

È un pacchetto ufficiale, ma non ben documentato nella Sicurezza Guida . Non è nella pagina 5.964(!) Pacchetto PL/SQL e tipi di riferimento e devi grant execute on dbms_sqlhash to [user]; perché funzioni, probabilmente è per questo che quasi nessuno ne ha sentito parlare.

Ad esempio:

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

Possibilità di collisione

Ci sono alcune domande sulle possibilità di una collisione:Hash Collision - quali sono le possibilità? , Può due stringhe diverse generare lo stesso codice hash MD5?

Non sono sicuro di cosa accada esattamente alla possibilità quando inizi a sommare molte righe, ma le possibilità di una singola collisione sono così ridicolmente basse che probabilmente stai bene.

Non so la matematica, ma sono sicuro che la causa più probabile di una collisione è da un errore di programmazione se si tenta di scrivere la propria funzione.

Ho visto e creato script proprio come questo, e ci sono molti modi sottili per rovinare tutto. Ad esempio, valori nulli e scambio di valori tra righe o colonne. Anche se stai usando solo una colonna ora, per impedire a qualcuno di scrivere uno di quegli script brutti dovresti usare il pacchetto fornito da Oracle ogni volta che è possibile.