Варианты OLE, используемые старшими версиями Visual Basic и широко распространенные в COM Automation, могут хранить множество различных типов: базовые типы, такие как целые и плавающие, более сложные типы, такие как строки и массивы, и вплоть до * 1001.* реализации и указатели в виде ByRef
вариантов.
Варианты также слабо типизированы: они преобразуют значение в другой тип без предупреждения в зависимости от того, какой оператор вы применяете и какие текущие типы имеют переданные значенияоператору.Например, сравнение двух вариантов, один из которых содержит целое число 1
, а другой содержит строку "1"
, на равенство вернет True
.
Итак, предположим, что я работаю с вариантами на основе данныхуровень (например, VARIANT
в C ++ или TVarData
в Delphi - т.е. большое объединение различных возможных значений), как я должен последовательно хэшировать варианты, чтобы они подчинялись правильным правилам?
Правила:
- Варианты, которые хэшируют неравномерно, должны сравниваться как неравные как в сортировке, так и в прямом равенстве
- Варианты, которые сравниваются как равные как для сортировки, так и для прямого равенства, должны хешироваться как равные
Это нормально, если мне нужно использовать разные правила сортировки и прямого сравнения для подгонки хэширования.
В настоящее время я работаю так, как нормализую варианты строк (если они подходят),и обрабатывать их как строки, в противном случае я работаю с вариантами данных, как если бы это был непрозрачный большой двоичный объект, и хэширую и сравниваю их необработанные байты.Конечно, у этого есть некоторые ограничения: числа 1..10
сортируются как [1, 10, 2, ... 9]
и т. Д. Это слегка раздражает, но оно непротиворечиво и очень мало работает.Тем не менее, мне интересно, есть ли принятая практика для этой проблемы.