gpt4 book ai didi

Java Map::hashCode() 冲突 - 为什么?

转载 作者:搜寻专家 更新时间:2023-11-01 01:04:29 27 4
gpt4 key购买 nike

以下代码导致为两个 map 生成相同的哈希码,有什么想法吗?


import java.util.HashMap;
import java.util.Map;

public class Foo
{
@SuppressWarnings("unchecked")
public static void main (String[] args)
{
Map map;

map = new HashMap();

map.put("campaignId", 4770L);
map.put("location", "MINI_PROFILE");
map.put("active", "true");
map.put("lazy", true);

System.out.println(map.hashCode());

map = new HashMap();

map.put("campaignId", 4936L);
map.put("location", "MINI_PROFILE");
map.put("active", "true");
map.put("lazy", false);

System.out.println(map.hashCode());


}
}

结果是:

-1376467648
-1376467648

只需更改键名就足以使代码生成两个不同的哈希码。

最佳答案

纯属巧合,我怀疑...必然会发生冲突,在这种情况下,第一个值中的相关不同位似乎有效地丢失了。

但是,它应该没有任何区别 - 使用哈希码的任何东西都必须应对冲突。

编辑:这只是哈希值的计算方式。此代码显示了正在发生的事情:

import java.util.*;

public class Test
{
@SuppressWarnings("unchecked")
public static void main (String[] args)
{
AbstractMap.SimpleEntry[] entries = {
new AbstractMap.SimpleEntry("campaignId", 4770L),
new AbstractMap.SimpleEntry("campaignId", 4936L),
new AbstractMap.SimpleEntry("lazy", true),
new AbstractMap.SimpleEntry("lazy", false)
};
for (AbstractMap.SimpleEntry entry : entries) {
System.out.println(entry + ": " + entry.hashCode());
}
}
}

结果:

campaignId=4770: -1318251287
campaignId=4936: -1318251261
lazy=true: 3315643
lazy=false: 3315617

所以在一对中,第一个映射的哈希值比第二个映射 26,而在另一对中,第一个映射的哈希值比第二个映射 26 .

AbstractMap 只是对散列值求和(一种确保排序不相关的方法),因此两者最终得到相同的散列码。

这真的取决于 Boolean.hashCode(),它看起来像这样:

return value ? 1231 : 1237;

... 和 Long.hashCode() 如下所示:

return (int)(value ^ (value >>> 32));

鉴于他们碰巧在 Boolean.hashCode() 中选取的值,如果您的 long 值仅相隔 26(或相隔 26 * 2^32),那么您会遇到同样的事情。

关于Java Map::hashCode() 冲突 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3630887/

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