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

时间:2010-03-19 18:12:55

标签: c++ delphi winapi com variant

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

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

假设我正在使用底层数据级别的变体(例如C ++中的True或Delphi中的VARIANT - 即不同可能值的大联合),我应该如何散列变体始终如一,以便他们遵守正确的规则?

规则:

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

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

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

3 个答案:

答案 0 :(得分:2)

在使用散列函数和声明的要求之间存在内在的紧张关系,这些要求是针对散列的输入进行验证的。我建议我们记住一般哈希的一些属性:在哈希过程中信息丢失,并且预计会发生哈希冲突。可以在没有冲突的情况下构造完美的哈希,但是如果函数的域是任何可能的OLE变体,那么构造完美的哈希函数将是有问题的(或者不可能?)。另一方面,如果我们不是在谈论一个完美的哈希,那么你的第一条规则就会被违反。

我不知道你想要完成什么的更大的背景,但我必须推翻你的一个假设:哈希函数真的是你想要的吗?如果您开发的系统对所有可能的OLE Variant属性进行编码而不是哈希,以便以后可以调用它们并与其他Variant图像进行比较,则可以以相当简单的方式满足您的要求。

将Variant转换为字符串表示的基线实现正朝着这个方向发展。毫无疑问,Variant可以包含指针,双指针和数组,因此您必须开发这些数据类型的一致字符串表示形式。我怀疑这种方法是否真的可以归类为哈希。你不只是持久化数据属性吗?

答案 1 :(得分:0)

总而言之,为了使你的东西可以比较你首先流式传输到一个普通的格式,字符串或blob。

你如何处理,例如本地化,例如形成实物?与包含在另一个语言环境中创建的相同实际的字符串相比较的实际值将失败。或者使用不同的精度设置写入字符串。

听起来我认为equal()的定义是问题,而不是散列。如果“相等”值可以不同地序列化为字符串(或blob),则散列将失败。

答案 2 :(得分:0)

等于的VARIANTS的哈希码应相等。

如果不了解用于测试平等的等同和强制规则,很难提出正确的实现。

相关问题