Как использовать ora_hash для столбца типа данных xmltype

Я хотел бы использовать ORA_HASH для типа данных xmltype, а обходные пути - это простые решения?

Я использую oracle 11g r2 и двоичный файл xml в качестве варианта хранения для столбца xmltype.

Запрос, который я использовал для создания таблицы:

create table samplebinary ( indexid number(19,0) , xmlcolumn xmltype not null) xmltype column xmlcolumn store as binary xml;


person Nishanth Lawrence    schedule 23.04.2014    source источник
comment
Почему вы хотите его использовать — это должен быть ora_hash или просто a хэш? Будет ли достаточно получить хэш первых 4k контента?   -  person Alex Poole    schedule 23.04.2014
comment
Нет, я хочу убедиться, что весь XML-документ не был изменен   -  person Nishanth Lawrence    schedule 23.04.2014


Ответы (1)


Как вы уже знаете, ora_hash не принимает значения long или LOB< /а>. Вы можете передать первые 4 КБ или 32 КБ содержимого XML, но если вам нужно убедиться, что весь XML-документ не изменился, этого будет недостаточно. И, как упомянул Бен, ora_hash имеет максимум 4294967295 сегментов, поэтому коллизии более вероятны, чем с SHA-1 или MD5. Как говорится в документации, ora_hash «полезен для таких операций, как анализ подмножества данных и создание случайной выборки».

Вы можете использовать пакет dbms_crypto для хеширования всего XMLType. значение в виде CLOB, извлеченного с помощью функции getClobVal с функцией-оболочкой для упрощения использования:

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     
person Alex Poole    schedule 23.04.2014
comment
ORA_HASH() все равно не сообщит вам, изменилось ли 32k. Значений так мало, что очень легко получить конфликт. - person Ben; 23.04.2014
comment
Я получаю одно и то же хэш-значение для всех полей xml, несмотря на то, что все они разные. - person Nishanth Lawrence; 23.04.2014
comment
@NishanthLawrence - я не вижу такого поведения, любая разница в содержимом XML создает другое значение хеш-функции. (Столкновения все еще возможны, но очень маловероятны). Не видя ваших данных или того, как вы реализовали и назвали это, я не уверен, что может быть не так. Является ли какой-либо из ваших XML достаточно коротким, чтобы добавить пару примеров к вопросу? - person Alex Poole; 23.04.2014
comment
@ALex Poole Я забыл упомянуть, что использую вариант хранения в виде двоичного xml. - person Nishanth Lawrence; 23.04.2014
comment
@NishanthLawrence - не имеет значения, в любом случае это значение по умолчанию в 11g. (Предполагая, что вы имеете в виду столбец XMLType в таблице, а не table of xmltype, что отличается - возможно, добавьте свою таблицу DDL к вопросу, чтобы уточнить?). Однако фактический контент по-прежнему основан на персонажах? - person Alex Poole; 23.04.2014
comment
@NishanthLawrence - я пробовал это со столбцом XMLType, который явно хранится как двоичный XML (что, как я уже сказал, используется по умолчанию); и с таблицей XMLType. Я получаю разные хеш-значения из разных XML-документов в обоих направлениях. Так что до сих пор не знаю, что отличается для вас. К сожалению, не могу сделать SQL Fiddle, так как он не поддерживает dbms_crypto. - person Alex Poole; 23.04.2014
comment
@Alex Poole Я использую только столбец xmltype. Я спросил вас об этом, потому что параметр хранения по умолчанию для xmltype в моем случае - CLOB, и если я оставлю его без изменений, я получу уникальные хэш-значения для каждого xml. - person Nishanth Lawrence; 23.04.2014
comment
@NishanthLawrence - в 11gR2 по умолчанию используется двоичный файл ... о нет, вы правы, это только из 11.2.0.2, поэтому, если вы используете 11.2.0.1, это все равно будет CLOB. Но тем не менее я получаю уникальные хеш-значения независимо от того, использую ли я явно хранилище CLOB или двоичное хранилище XML. - person Alex Poole; 23.04.2014
comment
@AlexPoole Я отредактировал вопрос и добавил свой DDL - person Nishanth Lawrence; 23.04.2014
comment
@NishanthLawrence - у меня так работает. Я получаю другой хеш в зависимости от того, хранится ли столбец как CLOB или двоичный, но это имеет смысл смотреть на то, что именно хранится (в двоичную версию добавляется раздел XSI). Похоже, вы могли найти ошибку, возможно, если вы находитесь на 11.2.0.1? Вместо этого вы можете попробовать hash_md5, но я сомневаюсь, что это будет иметь какое-то значение, если оно каким-то образом хэширует не то. - person Alex Poole; 23.04.2014
comment
@AlexPoole Наконец-то я начал работать, передав значение, возвращаемое Extract в xmlcolum, функции my_hash. Большое спасибо за функцию my_hash. - person Nishanth Lawrence; 25.04.2014