Comme vous le savez déjà, ora_hash
n'accepte pas long
ou valeurs LOB. Vous pouvez transmettre les premiers 4k ou 32k du contenu XML, mais si vous devez vous assurer que l'intégralité du document XML n'a pas changé, cela ne suffira pas. Et comme Ben l'a mentionné, ora_hash
a un maximum de 4294967295 compartiments, donc les collisions sont plutôt plus probables qu'avec SHA-1 ou MD5. Comme le dit la documentation, ora_hash
'est utile pour des opérations telles que l'analyse d'un sous-ensemble de données et la génération d'un échantillon aléatoire'.
Vous pouvez utiliser le dbms_crypto
package pour hacher toute la valeur XMLType, en tant que CLOB extrait avec le getClobVal
fonction, avec une fonction wrapper pour simplifier son utilisation :
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;
/
Vous pouvez ensuite transmettre votre XMLType, en tant que valeur ou en tant que colonne dans le cadre d'une sélection :
select my_hash(xml) from t42;
MY_HASH(XML)
---------------------------------------------
494C4E7688963BCF312B709B33CD1B5CCA7C0289