【问题标题】:How to use ora_hash on a column of datatype xmltype如何在数据类型 xmltype 的列上使用 ora_hash
【发布时间】:2014-06-07 20:59:30
【问题描述】:

我想在 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,还是只是a哈希?获取内容的前 4k 的哈希就足够了吗?
  • 不,我想确保整个 xml 文档没有被更改

标签: oracle oracle11g xmltype ora-hash


【解决方案1】:

如您所知,ora_hash doesn't accept long or LOB values。您可以传入前 4k 或 32k 的 XML 内容,但如果您需要确保整个 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 是否已经改变。值太少,很容易发生冲突。
  • 我为所有 xml 字段获得了相同的哈希值,尽管它们都不同。
  • @NishanthLawrence - 我看不到这种行为,XML 内容的任何差异都会产生不同的哈希值。 (仍然可能发生碰撞,但可能性很小)。在没有看到您的数据或您如何实施和调用它的情况下,我不确定可能出了什么问题。您的 XML 是否足够短,可以在问题中添加几个示例?
  • @ALex Poole 我忘了提到我正在使用存储选项作为二进制 xml。
  • @NishanthLawrence - 像那样为我工作。根据列是存储为 CLOB 还是二进制,我得到不同的哈希值,但是查看存储的确切内容是有意义的(在二进制版本中添加了 XSI 部分)。如果您使用的是 11.2.0.1,听起来您可能发现了一个错误?你可以试试hash_md5,但我怀疑这会产生什么不同,如果它以某种方式散列错误的东西。
猜你喜欢
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
相关资源
最近更新 更多