As you already know, ora_hash
doesn't accept long
or LOB values. You could pass in the first 4k or 32k of the XML content, but if you need to make sure that the entire XML document hasn't changed, that won't be sufficient. And as Ben mentioned, ora_hash
has a maximum of 4294967295 buckets, so collisions are rather more likely than with SHA-1 or MD5. As the documentation says, ora_hash
'is useful for operations such as analyzing a subset of data and generating a random sample'.
You can use the dbms_crypto
package to hash the whole XMLType value, as a CLOB extracted with the getClobVal
function, with a wrapper function to make it simpler to use:
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;
/
You can then pass in your XMLType, as a value or as a column as part of a select:
select my_hash(xml) from t42;
MY_HASH(XML)
---------------------------------------------
494C4E7688963BCF312B709B33CD1B5CCA7C0289
ora_hash
, or just a hash? Would getting the hash of the first 4k of the content suffice? – Thimbleweed