hashmap中的hashcode实现

时间:2016-11-16 09:53:34

标签: java hash hashmap

我正在完成Hashmap的实现,并在下面的代码中找到了计算哈希码的代码。能否请您解释一下如何计算h的值以及为什么以这种特定方式完成?

final int hash(Object k) {
    int h = hashSeed;
    if (0 != h && k instanceof String) {
        return sun.misc.Hashing.stringHash32((String) k);
    }

    h ^= k.hashCode();

    // This function ensures that hashCodes that differ only by
    // constant multiples at each bit position have a bounded
    // number of collisions (approximately 8 at default load factor).
    h ^= (h >>> 20) ^ (h >>> 12);
    return h ^ (h >>> 7) ^ (h >>> 4);
}

2 个答案:

答案 0 :(得分:1)

这是一种确保每个对象的哈希码是唯一的方法,创建种子进行一些操作以找到唯一键,并且该键将存储在地图中。

如您所知,将地图商店信息作为对键值。然后该方法最重要的一行是

h ^= k.hashCode();

您需要确保在代码中,如果决定覆盖hashCode()方法,即按对象返回唯一代码/ id,或者您可以覆盖同一映射中的不同对象。

我希望这能澄清一点你的怀疑

答案 1 :(得分:1)

使用.radio-item { display: inline-block; position: relative; padding: 0 6px; margin: 10px 0 0; } .radio-item input[type='radio'] { display: none; } .radio-item label { color: #666; font-weight: normal; } .radio-item label:before { content: " "; display: inline-block; position: relative; top: 5px; margin: 0 5px 0 0; width: 20px; height: 20px; border-radius: 11px; border: 2px solid #004c97; background-color: transparent; } .radio-item input[type=radio]:checked + label:after { border-radius: 11px; width: 16px; height: 16px; position: absolute; top: 9px; left: 10px; content: " "; display: block; background: #004c97; } 函数计算

Hashcode。你必须先研究这个功能。

计算哈希码后的原因是使用下面的

再次重新哈希
hashCode()

是为了避免进一步的碰撞。

找到原文

h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);

参见评论。