我想在xmltype數據類型上使用ORA_HASH,並且解決方法是直截了當的解決方案?如何在一列數據類型xmltype上使用ora_hash
我使用Oracle 11g R2和二進制XML作爲存儲選項XMLType列,我用於創建表
查詢
create table samplebinary (indexid number(19,0) , xmlcolumn xmltype not null) xmltype column xmlcolumn store as binary xml;
我想在xmltype數據類型上使用ORA_HASH,並且解決方法是直截了當的解決方案?如何在一列數據類型xmltype上使用ora_hash
我使用Oracle 11g R2和二進制XML作爲存儲選項XMLType列,我用於創建表
查詢
create table samplebinary (indexid number(19,0) , xmlcolumn xmltype not null) xmltype column xmlcolumn store as binary xml;
正如你已經知道,ora_hash
doesn't accept long
or LOB values。您可以傳遞XML內容的第一個4k或32k,但如果您需要確保整個XML文檔沒有發生變化,那麼這是不夠的。正如Ben所說,ora_hash
最多有4294967295個桶,所以碰撞比SHA-1或MD5更有可能。正如文檔所述,ora_hash
'對於諸如分析數據子集和生成隨機樣本等操作非常有用。
您可以使用the dbms_crypto
package湊整的XMLType值,與the getClobVal
function提取,包裝功能的CLOB,使其更易於使用:
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;
/
然後,您可以在您的XMLType傳遞,作爲值或列作爲選擇的一部分:
select my_hash(xml) from t42;
MY_HASH(XML)
---------------------------------------------
494C4E7688963BCF312B709B33CD1B5CCA7C0289
ORA_HASH()不會告訴你,如果32K已經改變了。有這麼幾個價值,所以很容易發生衝突。 – Ben
儘管所有的xml字段都是不同的,但我獲得了相同的哈希值。 –
@NishanthLawrence - 我沒有看到這種行爲,XML內容的任何區別都會創建不同的哈希值。 (碰撞仍然是可能的,但不太可能)。沒有看到你的數據或你如何實施和調用這個,我不知道什麼可能是錯的。你的XML是否足夠短,可以添加幾個例子來解決這個問題? –
爲什麼要使用它 - 是否必須是'ora_hash',或只是* a *散列?獲得內容的第一個4k的散列就足夠了嗎? –
不,我想確保整個xml文檔沒有改變 –