微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

hashMap 中的自定义键生成和冲突

如何解决hashMap 中的自定义键生成和冲突

我有一种方法可以将对象保存在哈希映射(用作缓存)中,该哈希映射以 String 作为键。
方法中传递的对象要么具有“易失性”字段,即它们可以在下次刷新数据存储时更改,要么在除 3 个字段之外的所有对象中都相同。
这些字段是 double 类型的 2 个字段和 String 类型的 1 个字段。
我现在正在做的是我使用:

Objects.hash(doubleField1,doubleField2,theString)   

并将结果转换为 String

基本上,我是根据不可变状态为该对象生成一个键。

这似乎有效,但我有以下问题:

如果我们排除有 2 个对象具有完全相同的字段的情况(这是不可能的),我最终会发生无法正确验证的碰撞的可能性有多大?
我的意思是,如果我有一个带有键的哈希图,例如字符串等如果 hashCode 上存在冲突,则比较键的实际值以验证它是否是同一个对象而不是冲突。
以我描述的方式使用密钥会在此类验证中产生问题吗?

更新:
如果我有例如键为 PersonhashCode 的哈希图是使用 fullNamessndateOfBirth 生成的,如果发生冲突,则哈希图实现使用 {{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 举报,一经查实,本站将立刻删除。