Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Schnellerer Hash mit weniger Kollisionen?

Welche Methode ist schneller?

Ich habe das nicht mit einem Benchmarking gemacht, aber ich würde vermuten, dass DBMS_SQLHASH am schnellsten ist, da es genau für diese Art von Problem gebaut wurde.

Es ist ein offizielles Paket, aber in der Sicherheit nicht gut dokumentiert Leitfaden . Es befindet sich nicht auf der Seite 5.964(!) PL/SQL Packages and Types Reference , und Sie müssen [Benutzer] grant execute on dbms_sqlhash to [user]; damit es funktioniert, hat wahrscheinlich fast niemand davon gehört.

Zum Beispiel:

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

Kollisionsgefahr

Es gibt einige Fragen zu den Wahrscheinlichkeiten einer Kollision:Hash Collision - Wie stehen die Chancen? , Kann zwei verschiedene Strings denselben MD5-Hashcode generieren?

Ich bin mir nicht sicher, was genau mit der Wahrscheinlichkeit passiert, wenn Sie anfangen, viele Zeilen zu summieren, aber die Wahrscheinlichkeit einer einzelnen Kollision ist so lächerlich gering, dass Sie wahrscheinlich in Ordnung sind.

Ich kenne die Mathematik nicht, aber ich bin sicher, dass die wahrscheinlichste Ursache einer Kollision ein Programmierfehler ist, wenn Sie versuchen, Ihre eigene Funktion zu schreiben.

Ich habe solche Skripte gesehen und gebaut, und es gibt viele subtile Möglichkeiten, es zu vermasseln. Beispielsweise Nullwerte und das Austauschen von Werten zwischen Zeilen oder Spalten. Auch wenn Sie jetzt nur eine Spalte verwenden, sollten Sie nach Möglichkeit das von Oracle bereitgestellte Paket verwenden, um zu verhindern, dass jemals jemand eines dieser hässlichen Skripte schreibt.