mysql布隆过滤器源码_通过实例解析布隆过滤器工作原理及实例
布隆过滤器
布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “一定不存在或者可能存在”。
相比于传统的 list、set、map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。
布隆过滤器的工作原理
假设一个长度为m的bit类型的数组,即数组中每个位置只占一个bit,每个bit只有两种状态:0,1,所有bit的初始状态都为0。
再假设一共有k个哈希函数,这些函数的输出域大于或者等于m,并且这些哈希函数,彼此之间相互独立,每个哈希函数计算出来的结果是独立的,可能相同也可能不相同,对每一个计算出来的结果都对m取余(%m),然后再将数组下标位置置为1。
我们这里假设m为13,k为3的布隆过滤器,来看看布隆过滤器的工作原理:
当我们要映射一个值到布隆过滤器时,首先计算三个哈希函数的值,然后对13取余,映射到对应位中,图中映射到2,6,10,这样我们就完成了一个值的映射。
那么怎么判断一个值是否存在,当一个值输入时,通过三个哈希函数,然后取余,我们就可以得到对应的三个位置,我们只需要判断这三个位置是否都为1,如果都为1,则该值存储,反之不存在。
但是有一个特殊情况,前面说了不同的哈希函数可能计算可能相同也可能不相同,而且不同的哈希函数对不同的值计算出来的值可能一样,这就造成一个结果,一个值通过哈希和取余得到的位置,早就被其它值给置1了,当我们存储的值过多,而这个bit数组过小,都会造成这种情况更多的发生,一个值明明不存在,而它的所有位置早就被其它不同值置1,造成了误判,这里就对布隆过滤器提出了一个指标:失误率p。
在同样数据规模下,不同大小的bit数组及不同数量k的哈希函数对误判率的结果:
如何选取最合适的m(bit数组的大小)及k(哈希函数的数量),在已知n(需要映射的值得数量)及失误率p的情况下:
m的选取:
k的选取:
给个例子:假设n=100亿,p=0.01%
通过公式计算出来m=19.19n,向上取整位20n,即2000亿个bit,也就是25gb。
通过公式计算出来k=14。
计算真实失误率:
根据公式计算出来的真实失误率位0.006%。
c语言实现
#include
#define size 100
#define bitsize size * 4 * 8
//c语言中一个整型数据类型4个字节
int bit[size]={0};
int sdbmhash(char *str)
{
unsigned int hash = 0;
while (*str)
{
// equivalent to: hash = 65599*hash + (*str++);
hash = (*str++) + (hash << 6) + (hash << 16) - hash;
}
return (hash & 0x7fffffff);
}
int rshash(char *str)
{
unsigned int b = 378551;
unsigned int a = 63689;
unsigned int hash = 0;
while (*str)
{
hash = hash * a + (*str++);
a *= b;
}
return (hash & 0x7fffffff);
}
int jshash(char *str)
{
unsigned int hash = 1315423911;
while (*str)
{
hash ^= ((hash << 5) + (*str++) + (hash >> 2));
}
return (hash & 0x7fffffff);
}
void insert(int hash){
//int value = hash%bitsize; ([0-3200]范围的值)
//int listindex = value / 32; (listindex为数组下标)
//int bitindex = value % 32; (某位)
int value = hash%bitsize;
int listindex = value / 32;
int bitindex = value % 32;
int temp = bit[listindex];
bit[listindex] = bit[listindex] & (1 << bitindex);
bit[listindex] = bit[listindex] | temp;
}
int serach(int hash){
int value = hash%bitsize;
int listindex = value / 32;
int bitindex = value % 32;
if (bit[listindex] | (1 << bitindex)){
return 1;
}
return 0;
}
int main () {
char str1[] = "abc123";
//在布隆过滤器中插入某值
insert(sdbmhash(str1));
insert(rshash(str1));
insert(jshash(str1));
//在布隆过滤器中判断某值是否存在
int i = 0;
i = i+serach(sdbmhash(str1));
i = i+serach(rshash(str1));
i = i+serach(jshash(str1));
if(i == 3){
printf("字符串:%s存在\n",str1);
}
return 0;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!
mysql布隆过滤器源码_通过实例解析布隆过滤器工作原理及实例相关推荐
- WebRTC源码研究(4)web服务器工作原理和常用协议基础
文章目录 WebRTC源码研究(4)web服务器工作原理和常用协议基础 前言 做WebRTC 开发为啥要懂服务器开发知识 1. Web 服务器简介 2. Web 服务器的类型 3. Web 服务器的工 ...
- php+mysql案例含源码_【专注】Zabbix源码安装教程—步骤详解(1)安装前准备
一.实验环境准备 Rhel 7.6 x86_64(server) 192.168.163.72 Rhel 6.5 x86_64(agent) 192.168.163.61 均已配置操作安装光盘为YUM ...
- mysql管理器源码_一个HelloWorld版的MySQL数据库管理器的设计与实现(源码)
2011年,实习期间写了一个简单的数据库管理器. 今天,特意整理了下,分享给大家. 有兴趣的同学,可以下载源码,瞧瞧. 源码只有4个类:LoginGUI,DatabaseGUI,Record,MySQ ...
- mysql php apache源码_源码安装apache+mysql+php
源码安装apache+mysql+php #!/bin/sh #byliangz at 2010-08-14 #环境: # 1. CentOS5.5或RHEL5.4,配置好IP地址,主机名等信 ...
- mysql查询优化器源码_源码下载网浅析MySQL 查询优化器
源码下载网浅析MySQL 查询优化器 时间:2019-01-18 17:45作者:网友投稿 优化器(The Optimizer) 这篇描述MySQL查询优化器的工作原理.MySQL查询优化器主要为执行 ...
- php mysql婚纱摄影网站源码_织梦大气婚纱影楼摄影企业网站模板源码 v5.7
织梦大气婚纱影楼摄影企业网站模板源码安装教程: 1.将下载的织梦源码全部传到空间根目录,由于有很多人反应安装后首页样式都乱的,(强烈要求安装到根目录,如:127.0.0.1 / www.xxx.com ...
- php发卡8.0源码_素材资源解析平台PHP源码 V8.0运营版+会员功能+代理功能+卡密充值...
源码预览 源码介绍 V8版本.最新更新,全新的解析架构. 小白问题一:为什么我不能解析? 答:解析是需要开通目标站VIP的. 小白问题二:竟然要开通VIP,要你这源码干嘛?有毛病.[这个问题真的有人问 ...
- WebRTC源码研究(4)web服务器工作原理和常用协议基础(转载)
前言 前面3篇博客分别对WebRTC框架的介绍,WebRTC源码目录,WebRTC的运行机制进行了介绍,接下来讲解一点关于服务器原理的知识.后面博客会写关于WebRTC服务器相关的开发,目前git上面 ...
- mysql布隆过滤器源码_布隆过滤器(Bloom Filter)的原理和实现
什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, ...
最新文章
- 差分阻抗为多少_谈谈差分信号
- jQuery 标签切换----之选项卡的实现
- legend3---lavarel常用artisan命令操作
- Emerged strategy 涌现战略
- 远程ykvm 插件移值java_远程管理KVM,命令行控制KVM,console连接,透传
- Qt与Visual Assitst X的集成问题
- 配置 SQL Server 2005 以允许远程连接(服务器端)
- Python-sorted函数
- 如何防止editor中出现遮行的现象
- IP城域网域内组播功能测试
- survival cutoff值
- Spring Boot 接入支付宝,实战来了
- Sharepoint visio Web Access
- 山东省下辖16个地级市和山东地形图12.5米
- 升职加薪/积分落户必备职称——2020年中级经济师不容错过
- html语言全拼,html标签全拼意思是什么
- 2017春季实习生招聘阿里面试题(一)
- 【高效办公】批量生成指定文件名文件夹
- JOJOの奇妙前端冒险(第一部) | 寻找C站宝藏
- 【STM32F407开发板用户手册】第27章 STM32F407的定时器应用之TIM1-TIM14的PWM实现
热门文章
- 数据科学家成长指南(下)
- 基于深度学习方法的图像分割,差距不止一点点
- 写给新手炼丹师:2021版调参上分手册
- 北大陈平原教授:写出优秀的学术论文,“小题大做”是关键
- 无监督方法实现C++、Java、Python 代码转换,程序员:出了bug怎么办,两种语言都要看吗?...
- 你听过Oracle中rownum用法吗?
- 爬虫之数据提取jsonpath模块的使用场景和使用方法
- 数据流分析与 SSA | 什么是静态单赋值 SSA
- 将CVESUMMARY写成HTML文件
- 爬虫-selenium初步学习与使用!