【问题标题】:Is it a good practice to compare the checksums of two complex objects instead of iterating?比较两个复杂对象的校验和而不是迭代是一种好习惯吗?
【发布时间】:2016-07-31 20:10:00
【问题描述】:

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

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

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

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

我分别对这两个数据集进行了序列化,并计算了它们的 md5 哈希值。我选择了md5,因为它无需外部扩展或库即可使用,而且运行速度非常快。我知道发生冲突的可能性,并且md5 哈希值几乎没有加密安全。

我的问题是:

  • 它是一种广泛使用的方法来验证任意类型的数据。检查文件校验和是有意义的,但我没有亲自使用它来比较这样的变量。
  • 我这样做主要是为了让我的代码保持简单。比较可能更快,因为只要首先发现不匹配,它就会中断比较。就我而言,数据的长度相当小。大约 5kb 作为序列化字符串。
  • 还有其他我应该知道的下站点吗?

提前致谢。

【问题讨论】:

  • 加星标 - 一个有趣的发现是 json_encode seem to be much fasterserialize
  • 听起来是个不错的计划,如果你能承受奇怪的失败

标签: php arrays performance comparison checksum


【解决方案1】:

如果您要查找数组中的更改,我实际上建议您使用CRC32()。和MD5() 一样,这个函数从 PHP 版本 4 开始就可以使用,不需要添加特殊的库。但是,CRC32() 实际上是用于错误检查的,并且比 MD5() 更快,MD5() 是散列函数,因此设计速度较慢。

特别是就您的语言无关答案而言,我总是会选择 CRC32() 而不是 MD5(),因为它更容易找到库,而且计算成本更低,使其成为几乎所有应用程序的理想选择,甚至是嵌入式应用程序设备。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2015-05-08
    • 2019-11-20
    相关资源
    最近更新 更多