《Redis设计与实现》_第四章_哈希算法

哈希算法
要想把一个新的键值对添加到字典里,程序首先需要根据键值对的计算出哈希值索引值。然后根据索引值将包含新键值对的哈希表节点放到哈希表数组的指定索引上面。
Redis计算哈希值和索引值的方法
#计算哈希值
字典设置的哈希函数——hashFunction(key);,它是dictType结构中保存的函数。
所以在计算时,调用dict结构中的type指针指向的hashFunction函数。

hash = dict->type->hashFunction(key);

#计算索引值
使用哈希表(dictht)中的sizemask属性和哈希值,计算出索引值。
根据不同情况,ht[x]可以是ht[0/1]。

index = hash & dict->ht[x].sizemask;

示例:
首先摆出一个空字典
《Redis设计与实现》_第四章_哈希算法_第1张图片
现在在这个空字典里面添加一个键值对k0和v0到字典里。
过程如下:
1.计算k0的哈希值,假设哈希值为8。

hash = dict->type->dictFunction(k0);

2.通过hash和sizemask属性计算索引值。

index = hash & dict->ht[0].sizemask = 8 & 3 = 0;//二进制与运算1000 & 0011 = 0000;

3.这个新的键值对就被添加到了ht[0]哈希表table数组的索引0位置上。
《Redis设计与实现》_第四章_哈希算法_第2张图片
字典被用作数据库的底层实现,或者哈希键的底层实现时,Redis使用MurmurHash2算法来计算键的哈希值。
MurmurHash2算法优点
即使输入的键是有规律的,算法仍然可以给出一个很好的随机分布性,计算速度也很快。

你可能感兴趣的:(redis设计与实现,redis)