计算数据结构的哈希值?

时间:2009-10-16 16:17:22

标签: algorithm hash data-structures

假设我想计算数据结构的哈希值,使用类似MD5的哈希算法接受串行流,以进行等价检查。 (我想记录哈希值,然后在相同或等效的数据结构上重新计算哈希值,并检查哈希值以高概率判断等价。)

有没有标准方法可以做到这一点?

我可以看到有问题的问题是

  • 如果数据结构包含二进制字符串数组,我不能只连接它们,因为[“abc”,“defg”]和[“ab”,“cdefg”]不是等效数组
  • 如果数据结构包含不保证以相同顺序枚举的集合,例如键值字典{a:“bc”,d:“efg”,h:“ijkl”}应该被认为等同于键值对{d:“efg”,h:“ijkl”,a: “BC”}。

4 个答案:

答案 0 :(得分:3)

对于第一个问题,还要哈希字符串的长度。这将区分他们的哈希。

对于第二个,对键进行排序。

答案 1 :(得分:2)

执行此操作的“标准”方法是定义数据结构的序列化形式,并消化生成的字节流。

例如,TBSCertificate是包含主题名称,扩展名和其他信息的数据结构。它以确定的方式转换为八位字符串,并作为数字签名操作的一部分进行散列以生成证书。

答案 2 :(得分:1)

结构体还存在另一个问题,即数据成员在不同平台上的对齐。 如果您想要一个稳定且可移植的解决方案,您可以通过为数据结构实现“serialize”方法来解决这个问题,方法是序列化将产生字节流(或更常见的是输出到字节流)。 然后,您可以将哈希算法与序列化流一起使用。通过这种方式,您将能够通过显式转换数据来解决您提到的问题。作为其他附加功能,您可以将数据保存到硬盘或通过网络发送。

对于字符串,您可以实现最先长度的Pascal类型存储。

答案 3 :(得分:1)

  • 如果字符串不能包含任何空字符,则可以使用C字符串来保证唯一性,例如。 “abc \ 0defg \ 0”与“cdefg \ 0”不同。
  • 对于字典,也许你可以在散列之前进行排序。

这也让我想起曾经听过的一个问题...我不知道你使用的语言是什么,但是如果你也是在没有过滤它们的情况下散列C结构,那么要小心字段之间的空间编译器可能为了对齐原因而引入的。有时那些不会被归零。