zoukankan      html  css  js  c++  java
  • [Leveldb]源码分析之三 BloomFilter模块的实现

    应用场景:

    由于Leveldb采用的是分层的存储结构,那么当Get一个key的时候最坏情况就是在所有的层级上都查询一遍这个key,这个开销是非常大的,引入BloomFilter之后,利用BloomFilter能够快速判断“是否存在”的特点可以很快速的知道需不需要在这个Level中进行查询。

    构造函数:
    explicit BloomFilterPolicy(int bits_per_key)
    这里没有默认构造函数,使用时需传入bits_per_key表示每个key的大小

    主要流程:
    1)初始化:

    k_ = static_cast<size_t>(bits_per_key * 0.69);
    
    if (k_ < 1) k_ = 1;
    
    if (k_ > 30) k_ = 30;

    bits_per_key 是传入的参数,表示每个key的大小,这里为何是*ln(2),我这里也没有搞清楚,如果有哪位高人知道推导的原理还望不吝赐教。

    k值表示的是需要进行hash的次数,这里限定了一个范围:(1,30)
    2)创建Filter

    size_t bits = n * bits_per_key_;  //filter的大小,这里的n是key的个数if (bits < 64) bits = 64;
    
    size_t bytes = (bits + 7) / 8;   // 向上取整到八的整数倍bits = bytes * 8;
    
    const size_t init_size = dst->size(); dst->resize(init_size + bytes, 0);
    
    dst->push_back(static_cast<char>(k_));  // 将hash函数的个数push到dot的末尾

    接下来就是将key做n次hash,把对应位设为1
    3) 查找是否存在
    该过程和创建Filter过程一样,只不过将设置对应bit位的操作该为判断该bit位是否为0,只要有一位为0则表示这个key是存在的。

    个人博客地址:http://www.yancey.info/?p=94

  • 相关阅读:
    Linux查看当前系统的发行版信息
    用 CentOS 7 打造合适的科研环境
    消息队列的使用场景
    RabbitMQ几种Exchange 模式
    JMS规范概览
    消息队列的学习
    springMVC参数传递实例
    java8时间处理实例
    windows电脑常用必备软件
    http后台json解析实例
  • 原文地址:https://www.cnblogs.com/yancey/p/3379702.html
Copyright © 2011-2022 走看看