0

背景:我有两个对象数组,我想知道这两个数组是否相同。我可以计算所有对象的 md5 并将它们加起来做一个比较吗?

基本上,如果我知道 md5(a)=md5(b),那么实际上 a=b

但是如果我知道 md5(a) + md5(b) = md5(c) + md5(d),我可以说 a=c 和 b=d 吗?

4

1 回答 1

1

我有两个对象数组,我想知道这两个数组是否相同。我可以计算所有对象的 md5 并将它们加起来做一个比较吗?

这是优化吗?

如果您只有 2 个数组,则不会从中受益,因为计算内存块的哈希是 O(​​n) 操作。如果您要比较一次数组,那么简单地比较长度和每个元素的简单方法会更快。

但是如果我知道 md5(a) + md5(b) = md5(c) + md5(d),我可以说 a=c 和 b=d 吗?

不。如果您需要一种快速的方法来消除大量案例,您可以将其用作初始猜测,因为 fora == cb == dto 为真,md5(a) == md5(c)并且md5(b) == md5(d)也必然为真。但是,不确定:存在 md5 检查会成功但数组不相等的情况。如果您决定依赖此检查,则需要确保清除此类误报。

此外,如果您取总和,顺序变得无关紧要。换句话说,您最终会遇到一些总和可能相等的不同情况:

  • a == cb == d(预期)
  • a == db == c(交换值)
  • a != ca != db != cb != d巧合的误报)

您将需要考虑所有这些,以使此启发式方法有用。

于 2012-10-24T19:06:39.320 回答