一、索引结构
MurMurHashTable的成员变量:
- bucket_num_:初始内存分配区桶的个数:256*1024
- header_:header部分的首地址
- first:初始内存分配区的首地址
MurMurHashTableHeader(64字节):
- bucket_num:所有桶的个数
- user_size:使用内存数
- magic:hash校验数组
bucket(17字节):
- value(6字节):value值
- next_bucket(29bit):桶距离first的offset(可以理解为编号)
- flags(3bit):3个标志位:key是否存到payload、hash值是否存到payload、桶的占用情况
- hash_code(4字节):key的hash值
- key_size(1字节)
- payload(char数组,2字节):key/key的hash值(与hash_code字段的hash种子不一致)
二、Bucket
1、Bucket
- 提供了3个标志位的赋值函数(Set、Mark)
- 检查hashcode是否存在payload
- 检查key的实际数据是否存在payload中(AVX指令集优化)
三、HashTable
1、初始化(Init)
- 两种初始化模式:加载/新建
2、插入(Insert)
- 插入数据KvPair,key:key的指针地址,value:值,len:key的长度,payload(暂不支持)
- GetBucketByKey(查找桶的位置)
- key的长度小于等于2字节时调用(GetBucketByKeyLePayloadSize)
- 求key的hash值,对桶的个数取模找到第一个桶的位置
- 判断桶是否为空(为空直接返回找到了桶)
- 循环遍历整个链表,直到找到最后一个桶
- 申请内存新建桶,添加桶
- key的长度大于2
- 整体过程类似,但是会pyload中存的是key的hash值(不同hash种子)
- key的长度小于等于2字节时调用(GetBucketByKeyLePayloadSize)
3、查找(Search)
与insert过程类似,关键步骤都是找桶
4、删除(Delete)
与insert过程类似,关键步骤都是找桶,找到桶后断链