zoukankan      html  css  js  c++  java
  • dict, hash

    dict: 

      dictKey -- > dictVal

    example:

         dictEntry *dictFind(dict *d, const void *key)
         Key is like a index which to find the real entry.

    how to find:

      depend on the construction of dict.

           if dict is constructed by arr then we get arr[i]. key is not integer usual and here the array is a map.

      if dict is constructed by hash table, then we get hash table value.

    redis code dictFind:

      

    typedef struct dict {
        dictType *type;
        void *privdata;
        dictht ht[2];
        long rehashidx; /* rehashing not in progress if rehashidx == -1 */
        int iterators; /* number of iterators currently running */
    } dict;
    
    typedef struct dictht {
        dictEntry **table;
        unsigned long size;
        unsigned long sizemask;
        unsigned long used;
    } dictht;
    

      

    dictEntry *dictFind(dict *d, const void *key)
    {
        dictEntry *he;
        unsigned int h, idx, table;
    
        if (d->ht[0].size == 0) return NULL; /* We don't have a table at all */
        if (dictIsRehashing(d)) _dictRehashStep(d);
        h = dictHashKey(d, key);
        for (table = 0; table <= 1; table++) {
            idx = h & d->ht[table].sizemask;
            he = d->ht[table].table[idx];
            while(he) {
                if (dictCompareKeys(d, key, he->key))
                    return he;
                he = he->next;
            }
            if (!dictIsRehashing(d)) return NULL;
        }
        return NULL;
    }
    
    

      key -> hashValue -> &hashMask -> hashIndex -> hashTable[hashIndex] (hashTableEleList[idx]) -> hashTableEleList[idx][j]

      dictKey ----------------------------------------------------------------------------------------------------------------------> dictVal

    why hash:

       

         no  hash table , store m * n elems. 

      hash, store m list head.

        seraching, storing...

        比如 dict 是个管理仓库的,仓库管理员按客人的姓名笔划来分架子。李一一来取货,dict算下李的在8号架子上,但是是8号架上的哪个柜子,要一个个来查看,只能根据姓名来一一对比了,最终找到客人的柜子,那个大的东西,肯定不好拿了,直接告诉李一一你的柜子地址就好了,让李一一去自己去对这个柜子中的东西操作。
      

  • 相关阅读:
    SQL Server 创建定时任务(计划任务,job,)
    SQL Server 2008 删除大量数据
    树莓派设置3.5mm接口输出音频
    树莓派打造音乐播放机
    树莓派设置闹钟
    树莓派开启crontab日志
    在Winform界面中使用DevExpress的TreeList实现节点过滤查询的两种方式
    在EasyUI项目中使用FileBox控件实现文件上传处理
    使用FastReport报表工具实现信封套打功能
    使用FastReport报表工具生成图片格式文档
  • 原文地址:https://www.cnblogs.com/ashen/p/11301828.html
Copyright © 2011-2022 走看看