索引-Hash索引实现

21 阅读1分钟

一、索引结构

image.png

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种子)
3、查找(Search)

与insert过程类似,关键步骤都是找桶

4、删除(Delete)

与insert过程类似,关键步骤都是找桶,找到桶后断链