gpt4 book ai didi

c++ - 散列 OLE 变体的推荐实现是什么?

转载 作者:可可西里 更新时间:2023-11-01 18:39:20 25 4
gpt4 key购买 nike

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

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

所以假设我在底层数据级别处理变体(例如 C++ 中的 VARIANT 或 Delphi 中的 TVarData - 即不同可能值的大 union ),我应该如何一致地散列变体以使它们遵守正确的规则?

规则:

  • 散列不相等的变体应该比较为不相等,无论是在排序还是直接相等
  • 对于排序和直接相等比较相等的变体应该散列为相等

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

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

最佳答案

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

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

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

关于c++ - 散列 OLE 变体的推荐实现是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2479591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com