sql >> Base de Datos >  >> RDS >> Oracle

¿Hash más rápido con menos colisiones?

¿Qué método es más rápido?

No he marcado esto en banco, pero supongo que DBMS_SQLHASH es el más rápido, ya que fue construido exactamente para este tipo de problema.

Es un paquete oficial, pero no está bien documentado en Seguridad Guía . No está en la página 5964(!) /a> , y debe grant execute on dbms_sqlhash to [user]; para que funcione, probablemente por eso casi nadie ha oído hablar de él.

Por ejemplo:

select sys.DBMS_SQLHASH.GETHASH(sqltext=>'select 1 from dual', digest_type=>1)
from dual;

tipo_resumen:1 =HASH_MD4, 2 =HASH_MD5, 3 =HASH_SH1

Posibilidad de colisión

Hay algunas preguntas sobre las posibilidades de una colisión:Hash Collision - ¿Cuáles son las posibilidades? , Pueden dos cadenas diferentes generar el mismo código hash MD5?

No estoy seguro de qué sucede exactamente con la posibilidad cuando comienzas a sumar muchas filas, pero las posibilidades de una sola colisión son tan ridículamente bajas que probablemente estés bien.

No sé las matemáticas, pero estoy seguro de que la causa más probable de una colisión es un error de programación si intenta escribir su propia función.

He visto y creado scripts como este, y hay muchas maneras sutiles de estropearlo. Por ejemplo, valores nulos y valores de intercambio entre filas o columnas. Aunque ahora solo está usando una columna, para evitar que alguien escriba uno de esos horribles scripts, debe usar el paquete proporcionado por Oracle siempre que sea posible.