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算法;
dicthtsizemask,hash&sizemask;
rehashdictht[2]

 

1.2.2  MurmurHash算法

关于这个算法网上可以找到对应的实现,而我偶然间发现的一片博客中指出,已经有稳定的构造碰撞的方法这篇文章,于我而言,需要注意在使用redis的时候不能直接将外部的输入作为键来存储数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值