Какова рекомендуемая реализация для хеширования Вариантов OLE?

Варианты OLE, как используется более старыми версиями Visual Basic и глубоко в Автоматизации COM, могут сохранить много различных типов: основные типы как целые числа и плавания, более сложные типы как строки и массивы, и полностью до IDispatch реализации и указатели в форме ByRef варианты.

Варианты также со слабым контролем типов: они преобразовывают значение в другой тип, не предупреждая, в зависимости от которого оператора Вы подаете заявку и что текущие типы имеют ценности, переданные оператору. Например, сравнивая два варианта, один содержащий целое число 1 и другой содержащий строку "1", поскольку равенство возвратится True.

Так предположение, что я работаю с вариантами на базовом уровне данных (например. VARIANT в C++ или TVarData в Delphi - т.е. большое объединение различных возможных значений), как я должен последовательно хешировать варианты так, чтобы они соблюли правильные правила?

Правила:

  • Варианты, которые хешируют неравноценно, должны выдержать сравнение как неравные, и в сортировке и в прямом равенстве
  • Варианты, которые выдерживают сравнение столь же равный и для сортировки и для прямого равенства, должны хешировать как равный

Хорошо, если я должен использовать другую сортировку и прямые правила сравнения для создания соответствия хеширования.

Путем я в настоящее время работаю, я нормализую варианты к строкам (если они соответствуют), и обработка их как строки, иначе я работаю с различными данными, как будто это был непрозрачный блоб, и хеширование и сравнение его необработанных байтов. Это имеет некоторые ограничения, конечно: числа 1..10 вид как [1, 10, 2, ... 9] и т.д. Это является мягко раздражающим, но это последовательно, и это - очень мало работы. Однако я действительно задаюсь вопросом, существует ли принятая практика для этой проблемы.

7
задан mghie 23 March 2010 в 12:42
поделиться

3 ответа

Хеш-коды одинаковых ВАРИАНТОВ должны быть одинаковыми.

Не зная правил равенства и принуждения, которые используются для проверки равенства, трудно придумать правильную реализацию.

0
ответ дан 7 December 2019 в 18:42
поделиться

Итак, вкратце, чтобы сделать материал сопоставимым, вы сначала выполните поток в общем формате, строке или blob.

Как вы справляетесь, например, локализация, например формирование реалов? Реальное значение по сравнению со строкой, содержащей такое же реальное значение, созданное в другой локали, завершится ошибкой. Или настоящий, записанный в строку с другой настройкой точности.

Мне кажется, проблема заключается в определении равенства (), а не в хешировании. Если «равные» значения могут быть сериализованы в строку (или blob) по-другому, хеширование завершится ошибкой.

0
ответ дан 7 December 2019 в 18:42
поделиться

В вашем вопросе есть внутреннее противоречие между использованием хеш-функции и заявленными требованиями, которые должны быть проверены. против ввода хеша. Я бы посоветовал нам иметь в виду несколько общих свойств хэшей: информация теряется во время процесса хеширования, и следует ожидать конфликтов хешей. Можно построить идеальный хеш без коллизий, но было бы проблематично (или невозможно?) Построить идеальную хеш-функцию, если область определения функции является любым возможным вариантом OLE. С другой стороны, если мы не говорим об идеальном хэше, то ваше первое правило нарушается.

Я не знаю более широкого контекста того, что вы пытаетесь достичь, но я должен отказаться от одного из ваших предположений: действительно ли хеш-функция вам нужна? Ваши требования могут быть удовлетворены довольно просто, если вы разработаете систему, которая кодирует, а не хеширует все возможные атрибуты OLE Variant, чтобы их можно было вызывать позже и сравнивать с другими образами Variant.

Ваша базовая реализация преобразования Variant в строковое представление движется в этом направлении. Как вы, несомненно, знаете, вариант может содержать указатели, двойные указатели и массивы, поэтому вам придется разработать согласованное строковое представление этих типов данных. Я сомневаюсь, что этот подход действительно можно классифицировать как хэш. Разве вы не просто сохраняете атрибуты данных?

2
ответ дан 7 December 2019 в 18:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: