比较两个复杂对象的校验和而不是迭代是否是一种好的做法


Is it a good practice to compare the checksums of two complex objects instead of iterating?

假设您有两个数据集,需要确保它们没有更改。例如,一只手拿着一个对象数组,另一只手又拿着另一个数组。现在,您需要验证两个数组是否完全相同。

每个数组可以包含任何类型的数据:布尔值、字符串、对象、数组、NULL等。

比较两个数组内容时,应该完全相同。相同的数据类型和相同的顺序。

我没有迭代数组内容,使用可以比较不同类型数据的代码,以及可能的递归比较,而是提出了一个解决方案,如果你能说明其中是否有任何缺点,我将不胜感激。PHP是一种语言,但我更感兴趣的是一种与语言无关的答案。

我分别序列化了这两个数据集,并计算了它们的md5散列。我选择md5是因为它不需要外部扩展或库,而且工作速度很快。我知道发生冲突的可能性,md5哈希在加密方面几乎是不安全的。

我的问题是:

  • 它是一种广泛使用的方法来验证任意类型的数据吗。检查文件校验和是有意义的,但我个人并没有用它来比较这样的变量
  • 我这样做主要是为了保持代码的简单性。比较可能更快,因为每当它首先发现不匹配时,它就会破坏比较。在我的情况下,数据的长度相当小。大约5kb作为一个串行字符串
  • 还有其他缺点我应该了解一下吗

提前谢谢。

如果您在数组中寻找更改,我实际上建议您使用CRC32()。与MD5()一样,这个函数从第4版起就可以在PHP中使用,并且不需要添加特殊的库。然而,CRC32()实际上是用于错误检查的,它比MD5()更快,后者是一个哈希函数,因此在设计上更慢。

特别是在你的语言不可知的答案方面,我总是选择CRC32()而不是MD5(),因为它的库查找起来要简单得多,计算成本也要低得多,非常适合几乎所有应用程序,甚至是嵌入式设备。