代码之家  ›  专栏  ›  技术社区  ›  Barry Kelly

哈希OLE变体的建议实现是什么?

  •  7
  • Barry Kelly  · 技术社区  · 14 年前

    旧版本的visual basic所使用的ole变体在com自动化中非常普遍,它可以存储许多不同的类型:基本类型,如整数和浮点数,更复杂的类型,如字符串和数组,一直到 IDispatch 形式为的实现和指针 ByRef 变体。

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

    所以假设我在底层数据层处理变量(例如 VARIANT 在C++中或 TVarData 在delphi中,即不同可能值的大联合,我应该如何一致地散列变量,以便它们遵循正确的规则?

    规则:

    • 在排序和直接相等方面,散列不相等的变量应比较为不相等。
    • 对于排序和直接相等都比较为相等的变量应该散列为相等

    如果我必须使用不同的排序和直接比较规则才能使散列适合,这是可以的。

    我目前的工作方式是将变量规范化为字符串(如果它们合适的话),并将它们视为字符串,否则我将处理变量数据,就像处理不透明的blob一样,并对其原始字节进行散列和比较。当然,这有一些限制:数字 1..10 排序为 [1, 10, 2, ... 9] 等等,这有点烦人,但它是一致的,这是非常少的工作。但是,我想知道是否有一个公认的做法来解决这个问题。

    3 回复  |  直到 14 年前
        1
  •  0
  •   Andras Vass    14 年前

    相等变量的哈希码应相等。

    如果不知道用于测试等式的等式和强制规则,就很难找到正确的实现。

        2
  •  2
  •   Paul Keister    14 年前

    在您的问题中,使用散列函数和声明的需求之间存在内在的紧张关系,这些需求需要根据散列的输入进行验证。我建议我们通常记住散列的一些属性:在散列过程中信息会丢失,散列冲突是意料之中的。在没有冲突的情况下构造一个完美的散列是可能的,但是它会有问题(或者不可能?)如果函数的域是任何可能的OLE变量,则构造一个完美的哈希函数。另一方面,如果我们不是在讨论一个完美的散列,那么就违反了第一条规则。

    我不知道你想完成什么的大背景,但我必须收回你的一个假设:哈希函数真的是你想要的吗?如果开发一个系统,对所有可能的ole变量属性进行编码(而不是散列),以便以后可以调用这些属性并与其他变量图像进行比较,那么您的需求就可以以一种相当简单的方式得到满足。

    将变量转换为字符串表示的基线实现正朝着这个方向发展。毫无疑问,您知道,变量可以包含指针、双指针和数组,因此必须开发这些数据类型的一致字符串表示。我怀疑这种方法是否真的可以归类为散列。你不只是保存数据属性吗?

        3
  •  0
  •   Marco van de Voort    14 年前

    总而言之,要使内容具有可比性,首先要将流转换为通用格式、字符串或blob。

    如何处理本地化,如real的格式化?与包含在另一个语言环境中创建的相同实数的字符串相比,实数将失败。或者用不同的精度设置写入字符串的实数。

    在我看来,equal()的定义是问题所在,而不是散列。如果“equal”值可以以不同的方式序列化为字符串(或blob),散列将失败。