散列OLE变量的推荐实现是什么?

Bar*_*lly 7 c++ delphi com winapi variant

旧版本的Visual Basic中使用的OLE变体,在COM自动化中普遍存在,可以存储许多不同的类型:基本类型,如整数和浮点数,更复杂的类型,如字符串和数组,以及一直到IDispatch实现和指针形式的ByRef变种.

变量也是弱类型的:它们将值转换为另一种类型,而不会发出警告,具体取决于您应用的运算符以及传递给运算符的值的当前类型.例如,比较两个变体,一个包含整数1,另一个包含字符串"1",为了相等将返回True.

因此,假设我正在使用基础数据级别的变体(例如,VARIANT在C++或TVarDataDelphi中 - 即不同可能值的大联合),我应该如何一致地散列变体以使它们遵守正确的规则?

规则:

  • 不均匀散列的变体应该在排序和直接相等中比较为不相等
  • 对于排序和直接相等进行比较相等的变量应该相等

如果我必须使用不同的排序和直接比较规则以使哈希适合,那就没关系.

我正在工作的方式是我将变量规范化为字符串(如果它们适合),并将它们视为字符串,否则我正在使用变量数据,就像它是一个不透明的blob,并散列和比较它原始字节.当然,这有一些局限性:数字1..10排序[1, 10, 2, ... 9]等等.这有点令人讨厌,但它是一致的,而且工作很少.但是,我想知道这个问题是否有一个公认的做法.

And*_*ass 0

相等的 VARIANT 的哈希码应该相等。

如果不知道用于测试相等性的相等性和强制规则,就很难提出正确的实现。