ORA_HASH
é definitivamente determinístico para tipos de dados que podem ser usados para particionamento, como NUMBER, VARCHAR, DATE, etc. Mas
ORA_HASH
é não determinístico para pelo menos alguns dos outros tipos de dados, como CLOB. Minha resposta é baseada em neste Artigo de Jonathan Lewis sobre
ORA_HASH
. Jonathan Lewis não diz explicitamente que eles são determinísticos, mas menciona que
ORA_HASH
"parece ser a função usada internamente - com uma semente zero - para determinar a qual partição uma linha pertence em uma tabela particionada por hash". E se for usado para particionamento de hash, deve ser determinístico, ou então as junções de partição não funcionariam. Para mostrar que
ORA_HASH
pode ser não determinístico para alguns tipos de dados, execute a consulta abaixo. É de um comentário no mesmo artigo:with src as (select to_clob('42') val from dual connect by level<=5)
select val,ora_hash(val,7) from src order by 2;
Surpreendentemente, esses mesmos problemas acontecem com
dbms_sqlhash.gethash
.