数据库
首页 > 数据库> > redis源码阅读-数据结构篇-hyperloglog

redis源码阅读-数据结构篇-hyperloglog

作者:互联网

@

目录

5. HyperLogLog 实现 hyperloglog.c

数据结构定义

Helper函数(可跳过,需要时阅读)

元素哈希处理 O(1)

// 返回000...1的长度
// regp 保存哈希桶index
int hllPatLen(unsigned char *ele, size_t elesize, long *regp) {
    uint64_t hash, bit, index;
    int count;
	// 获取哈希值
    hash = MurmurHash64A(ele,elesize,0xadc83b19ULL);
    index = hash & HLL_P_MASK; // (1 << 14)个桶的index
    hash |= ((uint64_t)1<<63);// 确保至少一个1
    bit = HLL_REGISTERS; // 第15位开始算起
    count = 1; // 第一个出现1的rank
    while((hash & bit) == 0) {// 直到找到1
        count++;
        bit <<= 1;
    }
    *regp = (int) index;// (1 << 14)个桶的index
    return count;// 返回000...1的长度
}

添加基数 O(1)

int hllDenseAdd(uint8_t *registers, unsigned char *ele, size_t elesize) {
    uint8_t oldcount, count;
    long index;
    // 元素哈希处理
    count = hllPatLen(ele,elesize,&index);
    // 000...1的长度更长则添加
    HLL_DENSE_GET_REGISTER(oldcount,registers,index);
    if (count > oldcount) {
        HLL_DENSE_SET_REGISTER(registers,index,count);
        return 1;
    } else {
        return 0;
    }
}

...

关于HyperLogLog可以详见本人之前的博客解析

标签:uint64,index,const,hyperloglog,redis,uint8,源码,哈希,data
来源: https://www.cnblogs.com/jamgun/p/14869324.html