OLE 变体,在旧版本的 Visual Basic 中使用并且在 COM 自动化中普遍使用,可以存储许多不同的类型:整数和浮点数等基本类型,字符串和数组等更复杂的类型,一直到IDispatch
实现和指针变体的形式ByRef
。
变体也是弱类型的:它们将值转换为另一种类型而不会发出警告,具体取决于您应用的运算符以及传递给运算符的值的当前类型。例如,比较两个变体,一个包含整数1
,另一个包含字符串"1"
,是否相等将返回True
。
因此,假设我正在处理底层数据级别的变体(例如VARIANT
在 C++ 或TVarData
Delphi 中 - 即不同可能值的大联合),我应该如何一致地散列变体以使它们遵守正确的规则?
规则:
- 散列不相等的变体应该在排序和直接相等方面比较为不相等
- 对于排序和直接相等比较为相等的变体应该哈希为相等
如果我必须使用不同的排序和直接比较规则以使散列适合,那也没关系。
我目前的工作方式是将变体规范化为字符串(如果它们适合),并将它们视为字符串,否则我正在处理变体数据,就好像它是一个不透明的 blob,并对其进行散列和比较原始字节。当然,这有一些限制:数字1..10
排序[1, 10, 2, ... 9]
等。这有点烦人,但它是一致的,而且工作量很小。但是,我确实想知道这个问题是否有公认的做法。