1.2 字典(Linked List)
1.2.1 介绍
下图(1-7)为Linked List在Redis中的实现:
// 节点
typedef struct dictEntry
{
// 键
void *key;
// 值
union
{
void *val;
uint64_t u64;
int64_t s64;
} v;
// 链接下一个节点形成链表
struct dictEntry * next;
} dictEntry;
// 哈希表
typedef struct dictht
{
// 哈希表数组
dictEntry **table;
// 哈希表大小
unsigned long size;
// 哈希表大小掩码
// 用于计算索引
unsigned long sizemask;
// 哈希表已有节点数
unsigned long used;
} dictht;
// 对应类型数据操作函数
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);
// 销毁值的函数
void (*valDestructor)(void *privdata, void *obj);
} dictType;
// 字典
typedef struct dict
{
// 对应类型数据操作函数
dictType *type;
// 私有数据
void *privdata;
// 哈希表
dictht ht[2];
// rehash标志, -1时表示不再rehash操作
int rehashidx;
} dict;
Redis使用dictEntry存储节点值,使用dictht操作哈希表,dict实现各种类型数据的操作,dict操作字典,最终组成一个多态字典。
下图(1-8)为链表在内存中的结构:
下表(1-9)表述了dict特点和器实现之间的关系
hash冲突 | dict | *next,在最欢情况下哈希表将退化为单向链表 |
哈希算法 | dict | *key,murmurhash算法; |
dictht | sizemask,hash&sizemask; | |
rehash | dict | ht[2] |
1.2.2 MurmurHash算法
关于这个算法网上可以找到对应的实现,而我偶然间发现的一片博客中指出,已经有稳定的构造碰撞的方法这篇文章,于我而言,需要注意在使用redis的时候不能直接将外部的输入作为键来存储数据。