sql >> Databáze >  >> RDS >> Oracle

Rychlejší hash s méně kolizemi?

Která metoda je rychlejší?

Neoznačil jsem to na benchmarku, ale tipl bych si, že DBMS_SQLHASH je nejrychlejší, protože byl vytvořen přesně pro tento typ problému.

Je to oficiální balíček, ale není dobře zdokumentován v Security Průvodce . Není to na stránce 5 964(!) Referenční informace o balíčcích a typech PL/SQL a musíte grant execute on dbms_sqlhash to [user]; aby to fungovalo, pravděpodobně proto o tom téměř nikdo neslyšel.

Například:

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

Možnost kolize

Existuje několik otázek ohledně pravděpodobnosti kolize:Hash Collision - jaké jsou šance? , Můžou být dva různé řetězce vygenerovat stejný hash kód MD5?

Nevím přesně, co se stane s pravděpodobností, když začnete sčítat mnoho řádků, ale šance na jedinou kolizi jsou tak směšně nízké, že jste pravděpodobně v pořádku.

Neovládám matematiku, ale jsem si jistý, že nejpravděpodobnější příčinou kolize je chyba programování, pokud se pokusíte napsat svou vlastní funkci.

Viděl jsem a sestavoval skripty přesně jako tento a existuje mnoho rafinovaných způsobů, jak to podělat. Například hodnoty null a prohození hodnot mezi řádky nebo sloupci. I když nyní používáte pouze jeden sloupec, abyste zabránili tomu, aby někdo napsal jeden z těch ošklivých skriptů, měli byste použít balíček dodaný Oracle, kdykoli je to možné.




  1. Upgradoval jsem SQL Server ODBC Driver a výkon byl negativně ovlivněn. Co můžu dělat?

  2. Zkontrolujte, zda je IP adresa uložena v databázi

  3. Neo4j - Pusťte index pomocí Cypher

  4. Rails:Jak rozdělit dotaz pro zápis/čtení do hlavní/podřízené databáze