字典

作者: sony93 | 来源:发表于2017-06-20 20:51 被阅读0次

    字典的实现

    哈希表

    typedef struct dictht {
        
        // 哈希表数组
        dictEntry **table;
    
        // 哈希表大小
        unsigned long size;
        
        // 哈希表大小掩码,用于计算索引值
        // 总是等于 size - 1
        unsigned long sizemask;
    
        // 该哈希表已有节点的数量
        unsigned long used;
    
    } dictht;
    

    table属性是一个数组,数组中的每个元素都是一个指向dictEntry结构的指针。每个dictEntry结构保存着一个键值对。

    哈希表节点

    /*
     * 哈希表节点
     */
    typedef struct dictEntry {
        
        // 键
        void *key;
    
        // 值
        union {
            void *val;
            uint64_t u64;
            int64_t s64;
        } v;
    
        // 指向下个哈希表节点,形成链表
        struct dictEntry *next;
    
    } dictEntry;
    

    字典

    /*
     * 字典
     */
    typedef struct dict {
    
        // 类型特定函数
        dictType *type;
    
        // 私有数据
        void *privdata;
    
        // 哈希表
        dictht ht[2];
    
        // rehash 索引
        // 当 rehash 不在进行时,值为 -1
        int rehashidx; /* rehashing not in progress if rehashidx == -1 */
    
        // 目前正在运行的安全迭代器的数量
        int iterators; /* number of iterators currently running */
    
    } dict;
    

    哈希算法

    当一个新的键值对加入字典时,程序根据 键 计算出哈希值和索引值,然后再根据索引值,将包含新键值对的哈希表节点放到哈希表数组的指引索引上。

    解决键冲突

    被分配到同一个索引上的多个节点可以用单向链表连接起来。新节点添加到链表表头。

    相关文章

      网友评论

          本文标题:字典

          本文链接:https://www.haomeiwen.com/subject/oytaqxtx.html