gpt4 book ai didi

Java 哈希码在不同机器上的工作方式不同

转载 作者:行者123 更新时间:2023-12-01 16:21:09 25 4
gpt4 key购买 nike

我有由 lombok 生成的哈希码,并将其用作标识符。逻辑如下:

@EqualsAndHashCode
@AllArgsConstructor
@Getter
public final class TestIdentifier {

private String firstName;
private String lastName;
private final LocalDate dob;

}

这就是我创建对象的方式:

TestIdentifier testIdentifier = new TestIdentifier(
StringUtils.lowerCase(value.getFirstName()),
StringUtils.lowerCase(value.getLastName()),
LocalDate.ofEpochDay(
value.getDateOfBirth()));
testIdentifier.hashCode()

用例:考虑两个具有以下名字/姓氏和出生日期的人。我希望它们的哈希值是相同的。

第一个人:

名字 姓氏 2000-08-09

第二个人:

名字姓氏2000-08-09

问题:

这些人的哈希代码在我的本地中是相同的,但是当我将此代码推广到不同的环境时,它们会导致不同的哈希代码。

我无法弄清楚这个问题。所以寻求帮助!!

最佳答案

非常旧的 lombok 版本在哈希码算法中使用略有不同的素数;这是改变的,因为知道它可能会破坏一些现有的代码,原因正是@Pruthvik在答案中所说的:你不应该依赖不同VM调用之间一致的哈希码。

但是,听起来您为相同 VM 调用获得了不同的哈希码,并且可能具有相同的字段 - 这不可能是由于涉及 lombok。

这一定意味着你们的场实际上并不相等。至少,lombok 通过为每个字段生成一个哈希码来生成哈希码; lombok 为所有 3 个列出的字段生成“子”哈希码的方式都是相同的:只需在这些对象上调用 hashCode() 方法即可。所以,这些可能正在改变。

要调试此问题,请编写一个方法来单独打印每个字段返回的哈希码。找到它们不同的地方,你就会发现不同的物体。例如,如果您当前的语言环境是土耳其语,则大写 I 会小写为无点 i,因此 "Jim".toLowerCase() 不等于 "JIM".toLowerCase() 在所有虚拟机上。这听起来是一个合理的解释。

我不知道为什么在大火中你会把工作外包给一个 apache 库,但我快速检查了文档,这个 stringutils 方法确实像听起来一样没用。它只是调用toLowerCase()。这确实存在“好吧,根据当前区域设置”的问题。也许可以尝试 lowerCase(theInput, Locale.ENGLISH)

注意:可以通过小写字符串来标准化比较的理论是一种误解。它适用于英语,但不适用于许多其他语言。除非您想遵守一条规则“除非所有用户都说英语、荷兰语、德语、丹麦语和其他一些西方语言,否则该软件无法工作”,否则您可能需要减少对小写内容的依赖,然后将其用于身份识别。荷兰的事情可能根本行不通,他们有那种奇怪的点 Y 的事情正在发生。 (“YPENBURG”.toLowerCase() 在正确的荷兰语中可能应该是“ijpenburg”,尽管与土耳其语不同,我认为区域设置实际上不会这样做)。

关于Java 哈希码在不同机器上的工作方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62273492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com