Która metoda jest szybsza?
Nie zaznaczałem tego w ławce, ale domyślam się, że DBMS_SQLHASH jest najszybszy, ponieważ został zbudowany właśnie z myślą o tego typu problemach.
Jest to oficjalny pakiet, ale nie jest dobrze udokumentowany w Bezpieczeństwo Przewodnik
. Nie ma go na stronie 5964(!) Informacje o pakietach i typach PL/SQL , i musisz grant execute on dbms_sqlhash to [user];
aby to zadziałało, prawdopodobnie dlatego prawie nikt o tym nie słyszał.
Na przykład:
select sys.DBMS_SQLHASH.GETHASH(sqltext=>'select 1 from dual', digest_type=>1)
from dual;
typ_podsumowania:1 =HASH_MD4, 2 =HASH_MD5, 3 =HASH_SH1
Możliwość kolizji
Istnieje kilka pytań dotyczących prawdopodobieństwa kolizji:Hash Collision - jakie są szanse? , Czy dwa różne ciągi wygenerować ten sam kod skrótu MD5?
Nie jestem pewien, co dokładnie dzieje się z szansą, gdy zaczniesz sumować wiele wierszy, ale szanse na pojedynczą kolizję są tak śmiesznie niskie, że prawdopodobnie nic ci nie jest.
Nie znam matematyki, ale jestem pewien, że najbardziej prawdopodobną przyczyną kolizji jest błąd programowania, jeśli spróbujesz napisać własną funkcję.
Widziałem i budowałem skrypty takie jak ten i jest wiele subtelnych sposobów, aby to schrzanić. Na przykład wartości null i zamiana wartości między wierszami lub kolumnami. Nawet jeśli używasz teraz tylko jednej kolumny, aby uniemożliwić komuś napisanie jednego z tych brzydkich skryptów, powinieneś używać pakietu dostarczonego przez Oracle, gdy tylko jest to możliwe.