哈希表的实现

2020-03-16  本文已影响0人  别时茫茫

哈希表的实现

1.基本数据结构

typedef struct dictEntry {
    void *key;// 键
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
        double d;
    } v; // 值(可以有几种不同类型)
    struct dictEntry *next;// 指向下一个哈希节点(形成链表)
} dictEntry;
typedef struct dictType {
        unsigned int (*hashFunction)(const void *key);//哈希计算方法,返回整形变量
        void *(*keyDup)(void *privdata, const void *key);
        void *(*valDup)(void *privdata, const void *obj);
        int (*keyCompare)(void *privdata, const void *key1, const void *key2);
        void (*keyDestructor)(void *privdata, void *key);//key的析构函数
        void (*valDestructor)(void *privdata, void *obj);//val的析构函数
} dictType;
typedef struct dictht {
        dictEntry **table;//字典实体,使用的是数组形式,方便查找key
        unsigned long size;//字典大小
        unsigned long sizemask;//字典掩码,为size-1
        unsigned long used;//这个字典表中(数组中),被使用的个数
} dictht;
typedef struct dict {
        dictType *type;//定义了对于hash表操作的一些列函数
        void *privdata;//私有的数据
        dictht ht[2];//两个hash表,一个新的一个旧的,可以在必要的时候进行hash表的扩张,和hash表的rehash。
        long rehashidx; /* rehashing not in progress if rehashidx == -1 *///rehash的标志-1表示没在rehash,可以根据这个值来取得两张hash表哪个可以使用。
        int iterators; /* number of iterators currently running *///这个hash表上迭代器的个数
} dict;
typedef struct dictIterator {
        dict *d;//管理hash表的数据机构
        long index;//索引
        int table, safe;//表和安全性标志
        dictEntry *entry, *nextEntry;//当前元素和下一个元素
        /* unsafe iterator fingerprint for misuse detection. */
        long long fingerprint;//指纹
} dictIterator;
static void _dictReset(dictht *ht)
dict *dictCreate(dictType *type, void *privDataPtr)
int _dictInit(dict *d, dictType *type,void *privDataPtr)

-根据参数对于管理两个hash表的数据结构进行初始化,设置

int dictExpand(dict *d, unsigned long size)
int dictRehash(dict *d, int n)
long long timeInMilliseconds(void)
int dictRehashMilliseconds(dict *d, int ms)
static void _dictRehashStep(dict *d)
static int _dictKeyIndex(dict *d, const void *key)
dictEntry *dictAddRaw(dict *d, void *key)
int dictAdd(dict *d, void *key, void *val)
dictEntry *dictFind(dict *d, const void *key)
int dictReplace(dict *d, void *key, void *val)
dictEntry *dictReplaceRaw(dict *d, void *key)
static int dictGenericDelete(dict *d, const void *key, int nofree)
int dictDeleteNoFree(dict *ht, const void *key)
int dictDelete(dict *ht, const void *key)
int _dictClear(dict *d, dictht *ht, void(callback)(void *))
void dictRelease(dict *d)
void *dictFetchValue(dict *d, const void *key)
dictIterator *dictGetIterator(dict *d)
dictIterator *dictGetSafeIterator(dict *d)
dictEntry *dictNext(dictIterator *iter)
void dictReleaseIterator(dictIterator *iter)
dictEntry *dictGetRandomKey(dict *d)
上一篇 下一篇

猜你喜欢

热点阅读