2014-04-23 17 views
1

我想在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;

+1

爲什麼要使用它 - 是否必須是'ora_hash',或只是* a *散列?獲得內容的第一個4k的散列就足夠了嗎? –

+1

不,我想確保整個xml文檔沒有改變 –

回答

6

正如你已經知道,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  
+1

ORA_HASH()不會告訴你,如果32K已經改變了。有這麼幾個價值,所以很容易發生衝突。 – Ben

+0

儘管所有的xml字段都是不同的,但我獲得了相同的哈希值。 –

+0

@NishanthLawrence - 我沒有看到這種行爲,XML內容的任何區別都會創建不同的哈希值。 (碰撞仍然是可能的,但不太可能)。沒有看到你的數據或你如何實施和調用這個,我不知道什麼可能是錯的。你的XML是否足夠短,可以添加幾個例子來解決這個問題? –

相關問題