如何解决hashMap 中的自定义键生成和冲突
我有一种方法可以将对象保存在哈希映射(用作缓存)中,该哈希映射以 String
作为键。
方法中传递的对象要么具有“易失性”字段,即它们可以在下次刷新数据存储时更改,要么在除 3 个字段之外的所有对象中都相同。
这些字段是 double
类型的 2 个字段和 String
类型的 1 个字段。
我现在正在做的是我使用:
Objects.hash(doubleField1,doubleField2,theString)
并将结果转换为 String
。
这似乎有效,但我有以下问题:
如果我们排除有 2 个对象具有完全相同的字段的情况(这是不可能的),我最终会发生无法正确验证的碰撞的可能性有多大?
我的意思是,如果我有一个带有键的哈希图,例如字符串等如果 hashCode 上存在冲突,则比较键的实际值以验证它是否是同一个对象而不是冲突。
以我描述的方式使用密钥会在此类验证中产生问题吗?
更新:
如果我有例如键为 Person
和 hashCode
的哈希图是使用 fullName
和 ssn
或 dateOfBirth
生成的,如果发生冲突,则哈希图实现使用 {{1 }} 来验证它是否是正在搜索的实际对象。
我想知道我描述的方法是否会在那部分存在一些问题,因为我直接生成了实际的密钥
解决方法
这是一个 hashMap 键实现的简单演示。在检索对象时,我会逐步构建字段以避免使用缓存的字符串或整数的任何可能性。这是一个更有说服力的演示。
Map<MyKey,Long> map = new HashMap<>();
map.put(new MyKey(10,"abc"),1234556L);
map.put(new MyKey(400,"aefbc"),548282L);
int n = 380;
long v = map.get(new MyKey(n + 20,"ae" + "fbc")); // Should get 548282
System.out.println(v);
印刷品
548282
关键类
class MyKey {
privat eint v;
private String s;
private int hashcode;
public MyKey(int v,String s) {
Objects.requireNonNull(s,"String must be provided");
this.v = v;
this.s = s;
// this class is immutable so no need to keep
// computing hashCode
hashcode = Objects.hash(s,v);
}
@Override
public int hashCode() {
return hashcode;
}
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (o == null) {
return false;
}
if (o instanceof MyKey) {
MyKey mk = (MyKey)o;
return v == mk.v && s.equals(mk.s);
}
return false;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。