Come già sai, ora_hash
non accetta long
o valori LOB. Potresti passare i primi 4k o 32k del contenuto XML, ma se hai bisogno di assicurarti che l'intero documento XML non sia cambiato, ciò non sarà sufficiente. E come ha detto Ben, ora_hash
ha un massimo di 4294967295 bucket, quindi le collisioni sono piuttosto più probabili rispetto a SHA-1 o MD5. Come dice la documentazione, ora_hash
'è utile per operazioni come l'analisi di un sottoinsieme di dati e la generazione di un campione casuale'.
Puoi usare il dbms_crypto
pacchetto per eseguire l'hashing dell'intero valore XMLType, come CLOB estratto con getClobVal
funzione, con una funzione wrapper per semplificarne l'utilizzo:
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;
/
Puoi quindi passare il tuo XMLType, come valore o come colonna come parte di una selezione:
select my_hash(xml) from t42;
MY_HASH(XML)
---------------------------------------------
494C4E7688963BCF312B709B33CD1B5CCA7C0289