gpt4 book ai didi

java - 更改存储在基于哈希的集合中的对象的哈希代码

转载 作者:行者123 更新时间:2023-12-02 00:04:51 24 4
gpt4 key购买 nike

我有一个基于哈希的对象集合,例如 HashSetHashMap。当 hashCode() 的实现因某些可变字段计算而随时间变化时,我会遇到哪些问题?

它如何影响 hibernate ?为什么默认情况下让 hashCode() 返回对象的 ID 是不好的?如果重要的话,所有尚未持久化的对象都有 id=0。

Hibernate 映射实体的 hashCode 的合理实现是什么?一旦设置,ID 就是不可变的,但在将实体保存到数据库时却并非如此。

我并不担心具有十几个 key=0 实体的 HashSet 的性能。我关心的是我的应用程序和 Hibernate 使用 ID 作为哈希码是否安全,因为 ID 在持久生成时会发生变化。

最佳答案

如果同一个对象的哈希码随着时间的推移而改变,结果基本上是不可预测的。哈希集合使用哈希代码将对象分配给存储桶 - 如果您的哈希代码突然发生变化,集合显然不知道,因此它可能无法找到现有对象,因为它现在哈希到不同的存储桶。

单独返回一个对象的ID并没有什么坏处,但是如果像你提到的那样,很多对象的id=0,就会降低哈希表的性能:所有具有相同哈希码的对象都会进入同一个桶,所以你的哈希表现在并不比线性列表更好。

更新:理论上,只要没有其他人知道,您的哈希代码就可以更改 - 这正是 @bestsss 在他的评论中提到的内容,即从任何集合中删除您的对象可能会保存它并在哈希码更改后再次插入它。实际上,更好的替代方法是根据对象的实际内容字段生成哈希码,而不是依赖数据库 ID。

关于java - 更改存储在基于哈希的集合中的对象的哈希代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5174233/

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