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

Hurtigere hash med færre kollisioner?

Hvilken metode er hurtigere?

Jeg har ikke benchmarkeret dette, men jeg vil gætte på, at DBMS_SQLHASH er den hurtigste, da den blev bygget præcis til denne type problemer.

Det er en officiel pakke, men ikke veldokumenteret i Sikkerhed Vejledning . Det er ikke på siden 5.964(!) PL/SQL-pakker og -typerreference , og du skal grant execute on dbms_sqlhash to [user]; for at det skal virke, er det nok derfor, næsten ingen har hørt om det.

For eksempel:

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

Risiko for en kollision

Der er nogle spørgsmål om chancerne for en kollision:Hash Collision - hvad er chancerne? , Kan to forskellige strenge generere den samme MD5-hash-kode?

Jeg er ikke sikker på præcis, hvad der sker med chancen, når du begynder at summere mange rækker, men chancerne for en enkelt kollision er så latterligt lave, at du sandsynligvis er ok.

Jeg kender ikke regnestykket, men jeg er sikker på, at den mest sandsynlige årsag til en kollision er en programmeringsfejl, hvis du prøver at skrive din egen funktion.

Jeg har set og bygget scripts som dette, og der er mange subtile måder at skrue det op på. For eksempel null-værdier og udskiftning af værdier mellem rækker eller kolonner. Selvom du kun bruger én kolonne nu, bør du bruge den Oracle-leverede pakke, når det er muligt, for at forhindre nogen i at skrive et af de grimme scripts.




  1. Hvordan opretter man et unikt indeks, hvor kolonnerækkefølgen ikke tages i betragtning (sæt?)

  2. ROW_NUMBER() i MySQL

  3. hvordan laver man en funktion for at returnere rækketype fra en tabel i pl/sql?

  4. Hvad er SQL Server?