Redis学习——1. 基础数据结构(三):字典

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的时候不能直接将外部的输入作为键来存储数据。

猜你喜欢

转载自blog.csdn.net/Finalowee/article/details/81104440