Como você já sabe,
ora_hash
não aceita long
ou valores LOB. Você pode passar os primeiros 4k ou 32k do conteúdo XML, mas se precisar ter certeza de que todo o documento XML não foi alterado, isso não será suficiente. E como Ben mencionou, ora_hash
tem um máximo de 4294967295 buckets, portanto, as colisões são mais prováveis do que com SHA-1 ou MD5. Como diz a documentação, ora_hash
'é útil para operações como analisar um subconjunto de dados e gerar uma amostra aleatória'. Você pode usar o
dbms_crypto
pacote para fazer o hash de todo o valor XMLType, como um CLOB extraído com o getClobVal
função, com uma função wrapper para torná-lo mais simples de usar:create or replace function my_hash(xml xmltype) return raw is
begin
return dbms_crypto.hash(src=>xml.getclobval(), typ=>dbms_crypto.hash_sh1);
end;
/
Você pode então passar seu XMLType, como um valor ou como uma coluna como parte de uma seleção:
select my_hash(xml) from t42;
MY_HASH(XML)
---------------------------------------------
494C4E7688963BCF312B709B33CD1B5CCA7C0289