1

例如,我有两个对象,一个类,Person。

Person A:
User_name:n1
Password:1234
Email:n1@email.com

Person B:
User_name:n1
Password:1234
Email:n1@email.com

因为 Person A 和 Person B 的值相同,所以我想编写自己的 isValueEqual 函数。首先,我想比较它们的类,然后,我将它们的值逐一检查是否相等。我认为这种方式非常耗时。因此,我认为将其变成 JSON 字符串并使用 md5 对它们进行散列并仅比较散列是可靠的。那么,这是比较它们的价值的更好方法吗?谢谢。

4

4 回答 4

5

不会。您可能会遇到哈希冲突,从而将两个不同的对象识别为相同的对象。

比较字段需要什么时间?如果您担心计算时间,请先测量它(如果您认为它太慢,我会感到非常惊讶,并且哈希计算会非常慢)。如果您担心实施时间,请查看Apache Commons EqualsBuilder或类似工具。

于 2012-11-02T17:17:40.607 回答
2

为了更详细地解释 Jim Garrison 在此评论中解释的内容,只需考虑通过比较字段来实现 equals 所需的工作,以及通过生成哈希和比较哈希来实现它所需的工作。让我们以您的示例为例,A 和 B 仅在电子邮件的最后一个字母上有所不同(这是最坏的情况)。

第一种方法:

  • 遍历所有名称字符并比较它们
  • 遍历所有密码字符并比较它们
  • 遍历所有电子邮件字符并进行比较。

第二种方法:

  • 创建两个新的 StringBuilders
  • 遍历所有名称字符以填充 JSON 字符串中的名称,并将它们附加到 StringBuilder,用引号括起来,特殊字符转义等。
  • 遍历所有密码字符以将密码填充到 JSON 字符串中,并将它们附加到 StringBuilder 中,用引号括起来,特殊字符转义等。
  • 遍历所有电子邮件字符以将电子邮件填充到 JSON 字符串中,并将它们附加到 StringBuilder,用引号括起来,特殊字符转义等。
  • 将 StringBuilders 转换为 Strings
  • 将字符串转换为字节数组
  • 对两个字节数组应用复杂的加密函数
  • 遍历每个字节数组并比较字节。

请注意,如果人员的第一个字符或姓名的长度不同,第一种方法会立即停止,而第二种方法必须执行每一步。

于 2012-11-02T17:30:36.207 回答
0

哈希函数会给您带来误报,因此您最终可能会遇到错误匹配。

尽管如果您的对象不会耗尽 MD5 并且错误匹配不会打扰您,那么您当然可以选择 MD5。

于 2012-11-02T17:19:30.460 回答
0

这样的事情比将对象转换为 JSON 然后计算它的 MD5 要快得多

public boolean equals( Object o ) {
    Person p = null;
    return    o instanceof Person
           && this.name.equals((p = (Person) o).name) 
           && this.password.equals(p.password)
           && this.email.equals(p.email);
}

但是,不要相信我,测量。

于 2012-11-02T17:30:09.553 回答