数据结构

dictht

  1. typedef struct dictht {
  2. // 哈希表数组
  3. dictEntry **table;
  4. // 哈希表大小
  5. unsigned long size;
  6. // 哈希表大小掩码,用于计算索引值
  7. // 总是等于 size - 1
  8. unsigned long sizemask;
  9. // 该哈希表已有节点的数量
  10. unsigned long used;
  11. } dictht;
  1. +--------+
  2. |dictht |
  3. |--------| +-------------+
  4. |table |----->|dictEntry*[4]|
  5. |--------| |-------------|
  6. |size | | 0 |--> NULL
  7. |--------| |-------------|
  8. |sizemask| | 1 |--> NULL
  9. |--------| |-------------|
  10. |used | | 2 |--> NULL
  11. +--------+ |-------------|
  12. | 3 |--> NULL
  13. +-------------+

dictEntry

  1. typedef struct dictEntry {
  2. // 键
  3. void *key;
  4. // 值
  5. union {
  6. void *val;
  7. uint64_t u64;
  8. int64_t s64;
  9. } v;
  10. // 指向下个哈希表节点,形成链表
  11. struct dictEntry *next;
  12. } dictEntry;
  1. +--------+
  2. |dictht |
  3. |--------| +-------------+
  4. |table |----->|dictEntry*[4]|
  5. |--------| |-------------|
  6. |size | | 0 |--> NULL
  7. |--------| |-------------|
  8. |sizemask| | 1 |--> NULL
  9. |--------| |-------------| +---------+ +---------+
  10. |used | | 2 |---------->|dictEntry|-->|dictEntry|--> NULL
  11. +--------+ |-------------| |---------| |---------|
  12. | 3 |--> NULL | k1 | v1 | | k1 | v1 |
  13. +-------------+ +---------+ +---------+

dict

  1. typedef struct dict {
  2. // 类型特定函数
  3. dictType *type;
  4. // 私有数据
  5. void *privdata;
  6. // 哈希表
  7. dictht ht[2];
  8. // rehash 索引
  9. // 当 rehash 不在进行时,值为 -1
  10. int rehashidx; /* rehashing not in progress if rehashidx == -1 */
  11. } dict;
  1. typedef struct dictType {
  2. // 计算哈希值的函数
  3. unsigned int (*hashFunction)(const void *key);
  4. // 复制键的函数
  5. void *(*keyDup)(void *privdata, const void *key);
  6. // 复制值的函数
  7. void *(*valDup)(void *privdata, const void *obj);
  8. // 对比键的函数
  9. int (*keyCompare)(void *privdata, const void *key1, const void *key2);
  10. // 销毁键的函数
  11. void (*keyDestructor)(void *privdata, void *key);
  12. // 销毁值的函数
  13. void (*valDestructor)(void *privdata, void *obj);
  14. } dictType;
  1. +---------+
  2. |dict |
  3. |---------| +--------+
  4. |type | |dictht | +-------------+
  5. |---------| +---->|--------| |dictEntry*[4]|
  6. |privdata | | |table |---->|-------------|
  7. |---------| | |--------| | 0 |
  8. |ht |-----+ |size | |-------------| +---------+
  9. |---------| | |--------| | 1 |---->|dictEntry|----> NULL
  10. |rehashidx| | |sizemask| |-------------| |---------|
  11. +---------+ | |--------| | 2 | | k1 | v1 |
  12. | |used | |-------------| +---------+
  13. | +--------+ | 3 |
  14. | +-------------+
  15. | +--------+
  16. +------>|dictht |
  17. |--------|
  18. |table |
  19. |--------|
  20. |size |
  21. |--------|
  22. |sizemask|
  23. |--------|
  24. |used |
  25. +--------+

PS:和 java.util.HashMap 相似