热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Dictionary和HashSet的GetHashCode方法

如何解决《使用Dictionary和HashSet的GetHashCode方法》经验,为你挑选了1个好方法。



1> Scott Chambe..:

因为ContainsKey的逻辑与此类似.

//This is a simplified model for answering the OP's question, the real one is more complex.
private List>> _buckets = //....

public bool ContainsKey(TKey key)
{
    List> bucket = _buckets[key.GetHashCode() % _buckets.Length];
    foreach(var item in bucket)
    {
        if(key.Equals(item.Key))
            return true;
    }
    return false;
}

所有GetHashCode都会获得你的密钥进入的存储桶,它仍然必须通过该存储桶的每个成员并通过该Equals方法找到完全匹配.这就是为什么拥有良好的哈希码很重要,桶中的项目越少,foreach部分就越快.最佳可能的哈希码每个桶只有一个项目.


这是HashSet上包含的实际代码(Dictionary的ContainsKey非常相似,但更复杂)

private int[] m_buckets;
private Slot[] m_slots;

public bool Contains(T item) {
    if (m_buckets != null) {
        int hashCode = InternalGetHashCode(item);
        // see note at "HashSet" level describing why "- 1" appears in for loop
        for (int i = m_buckets[hashCode % m_buckets.Length] - 1; i >= 0; i = m_slots[i].next) {
            if (m_slots[i].hashCode == hashCode && m_comparer.Equals(m_slots[i].value, item)) {
                return true;
            }
        }
    }
    // either m_buckets is null or wasn't found
    return false;
}

private int InternalGetHashCode(T item) {
    if (item == null) {
        return 0;
    } 
    return m_comparer.GetHashCode(item) & Lower31BitMask;
}

internal struct Slot {
    internal int hashCode;      // Lower 31 bits of hash code, -1 if unused
    internal T value;
    internal int next;          // Index of next entry, -1 if last
}


推荐阅读
author-avatar
朱泊潇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有