这是使用MD5哈希比较两个Java对象值的可行方法



例如,我有两个对象,a class,person。

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

因为人A和人B都有相同的价值观,因此,我想写自己的Isvalueequal功能。首先,我想比较他们的课程,然后,我一个一个campare他们的价值一个一个,以检查它是否相等。我认为这种方式非常耗时。因此,我认为这是可靠的,可以使其成为JSON字符串,并使用MD5来哈希,并仅比较哈希。那么,这是比较其价值的更好方法吗?谢谢。

no。您可以遇到哈希碰撞,从而将两个不同的对象识别为相同。

比较领域有什么耗时的?如果您担心计算时间,请先测量它(如果您认为它太慢,我会感到非常惊讶,并且哈希计算将大大慢)。如果您担心实施时间,请访问Apache Commons等于企业或类似。

在更多详细信息中解释吉姆·驻军在此评论中解释的内容,只需考虑通过比较字段来实现平等所必需的工作,以及通过生成哈希并进行比较而实现它所需的工作哈希。让我们以A和B的榜样为例,仅与他们的电子邮件的最后一封信不同(这是最坏的情况)。

第一个方法:

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

第二种方法:

  • 创建两个新的StringBuilders
  • 遍历所有名称字符,以填充JSON字符串中的名称,并将其附加到弦乐器上,并被引号包围,特殊字符逃脱了,等等。
  • 遍历所有密码字符,以填充JSON字符串中的密码,并将其附加到弦乐器上,被引号包围,特殊字符逃脱等等。
  • 遍历所有电子邮件字符,以填充JSON字符串中的电子邮件,并将其附加到弦乐器上,并被引号包围,特殊字符逃脱等等。
  • 将StringBuilders转换为字符串
  • 将字符串转换为字节数组
  • 将复杂的加密功能应用于两个字节阵列
  • 遍历每个字节数组并比较字节。

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

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

类似的东西比将对象转换为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);
}

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

最新更新