布隆过滤器系统及过滤方法转让专利
申请号 : CN202010628830.4
文献号 : CN111930923B
文献日 : 2021-07-30
发明人 : 方贤斌 , 旷黎明 , 师文庆
申请人 : 上海微亿智造科技有限公司 , 常州微亿智造科技有限公司
摘要 :
权利要求 :
1.一种布隆过滤器系统,其特征在于,包括:初始化过滤器模块:每个过滤器初始化时需要传入p与n两个参数,n为插入的元素个数,p为误报率,生成哈希函数个数numHashFunctions和布隆过滤器长度bitSize;
计算过滤器bit数组模块:根据初始化过滤器生成的numHashFunctions和bitSize以及传入的被计算的值key这三个数据生成一个value,所述value根据numHashFunctions生成多个long类型值,然后将多个long类型值根据bitSize生成多个int类型的bit数组,最终返回bit数组;
判重模块:根据返回的bit数组进行循环获得每一个bit值,在数据库Redis中查询每一个bit值在数据库Redis里面bit位的值:如果值为0,则表示没有任何一个值映射到这个bit位上,value这个值不存在,调用更新或存储过滤器模块;如果返回的值为1,这value这个值已经存在,调用删除过滤器模块;
更新或存储过滤器模块:如果判断value这个值不存在于过滤器中后,就把返回的bit数组分别指向到bit位置,存储到Redis中存储;
删除过滤器模块:如果判断value这个值已经存在于过滤器中,则传入的被计算的值key为需要删除的key值,根据单个bit位把删除过滤器的计数器Counter的值减1,逐个处理;
初始化的n与p值后就可以控制bitSize与numHashFunctions值的生成大小,从而实现把新增到Redis中的值分区,每个区段的值有长度限制从而达到相互不影响的目的;
所述numHashFunctions和bitSize决定过滤器bit位的长度;
过滤器bit位的长度会影响过滤器最终的查询与更新值的效率与错误率;
所述生成一个value的过程包括:
初始化value数组值,数组长度为numHashFunctions,用户使用过滤器时会传入需要被验证的值key,然后把key生成hash 64位的long类型值,把这个long类型值生成10位长度的int类型值hash1,再用这个long类型值无符号右移>>>32位生成10位长度的int类型值hash2;
然后按照numHashFunctions长度来循环,按照hash1+i*hash2的计算方法生成nextHash值,i是循环下标,判断nextHash值是否小于0,小于0就对nextHash值取反运算;
然后给value赋值,值生成方法为:bitSize对nextHash取余运算:bit=nextHash%bitSize,bit值的大小不超过bitSize值;
通过采用把p与n两个参数变为动态,改造计算过滤器bit数组,包括初始化过滤器、计算过滤器bit数组、更新/存储过滤器;在更新/存储过滤器时创建一个新的key:countValue,用来存储统计过滤器存放过的value的数量,通过countValue知道已经存放的value总量,按照n等于2亿数据量来切分n,把n等分或按照比例分为100份,相当于划分100个区间,根据countValue大小当countValue每到达一个等份值时则更新p与n两个参数,使其根据实际数据量增大而改变从而改变numHashFunctions和bitSize;bitSize的大小在
100个区间里的每个区间中它的值是成倍数关系的,这样的倍数关系会改变过滤器bit数组中每个bit位大小的区间;当每个bit位大小的在100个区间中时相当于把过滤器所有的bit位划分了100份相对独立的空间存储;
countValue:记录项目实际过滤或存储的值,初始化为0,根据实际使用数量递增,存放在Redis中保存;
n值:表示预订的过滤值个数,初始化为2000000,以2000000为单位把目标值200000000分100个区段,在项目运行过程中单个区段固定不变;但当countValue值的值等于n时,n值就会被重新初始化,重新初始化的值为:n乘2,也就是以n值为基础倍数扩增;
p值:表示可接受的数据过滤误判概率,这个值的生成方法跟n值相同,初始化为
0.0000001,在运行过程中单个区段固定不变;但当countValue值的值等于n时,p值就会被重新初始化,重新初始化的值为:p除2;
把p与n两个参数变为动态,删除过滤器的计数器Counter的值根据countValue值到达的区间而等比例增大Counter大小,使得过滤器的每一个阶段拥有自己Counter,实现平衡空间利用率与资源占用的矛盾,保证过滤器的使用效率;
当传入需要删除的value后,根据单个bit位把计数器Counter的值减1,逐个处理;
使numHashFunctions永远不会接近为1,控制到最小值接近或等于3,达到使过滤器的错误率不会降低。
2.根据权利要求1所述的布隆过滤器系统,其特征在于,所述传入的被计算的值key指用户传入的数据;
一个数据对应一个key值,通过key值查询对应的数据在过滤器中是否存在。
3.根据权利要求1所述的布隆过滤器系统,其特征在于,所述生成哈希函数个数numHashFunctions和布隆过滤器长度bitSize的具体算法如下:如果算出来的numHashFunctions值小于等于3,则numHashFunctions取固定值3,禁止其小于3。
4.一种布隆过滤器的过滤方法,其特征在于,包括:初始化过滤器步骤:每个过滤器初始化时需要传入p与n两个参数,n为插入的元素个数,p为误报率,生成哈希函数个数numHashFunctions和布隆过滤器长度bitSize;
计算过滤器bit数组步骤:根据初始化过滤器生成的numHashFunctions和bitSize以及传入的被计算的值key这三个数据生成一个value,所述value根据numHashFunctions生成多个long类型值,然后将多个long类型值根据bitSize生成多个int类型的bit数组,最终返回bit数组;
判重步骤:根据返回的bit数组进行循环获得每一个bit值,在数据库Redis中查询每一个bit值在数据库Redis里面bit位的值:如果值为0,则表示没有任何一个值映射到这个bit位上,value这个值不存在,调用更新或存储过滤器步骤;如果返回的值为1,这value这个值已经存在,调用删除过滤器步骤;
更新或存储过滤器步骤:如果判断value这个值不存在于过滤器中后,就可以把返回的bit数组分别指向到bit位置,存储到Redis中存储;
删除过滤器步骤:如果判断value这个值已经存在于过滤器中,则传入的被计算的值key为需要删除的key值,根据单个bit位把删除过滤器的计数器Counter的值减1,逐个处理;
初始化的n与p值后就可以控制bitSize与numHashFunctions值的生成大小,从而实现把新增到Redis中的值分区,每个区段的值有长度限制从而达到相互不影响的目的;
所述numHashFunctions和bitSize决定过滤器bit位的长度;
过滤器bit位的长度会影响过滤器最终的查询与更新值的效率与错误率;
所述传入的被计算的值key指用户传入的数据;
一个数据对应一个key值,通过key值查询对应的数据在过滤器中是否存在;
所述生成一个value的过程包括:
初始化value数组值,数组长度为numHashFunctions,用户使用过滤器时会传入需要被验证的值key,然后把key生成hash 64位的long类型值,把这个long类型值生成10位长度的int类型值hash1,再用这个long类型值无符号右移>>>32位生成10位长度的int类型值hash2;
然后按照numHashFunctions长度来循环,按照hash1+i*hash2的计算方法生成nextHash值,i是循环下标,判断nextHash值是否小于0,小于0就对nextHash值取反运算;
然后给value赋值,值生成方法为:bitSize对nextHash取余运算:bit=nextHash%bitSize,bit值的大小不超过bitSize值;
通过采用把p与n两个参数变为动态,改造计算过滤器bit数组,包括初始化过滤器、计算过滤器bit数组、更新/存储过滤器;在更新/存储过滤器时创建一个新的key:countValue,用来存储统计过滤器存放过的value的数量,通过countValue知道已经存放的value总量,按照n等于2亿数据量来切分n,把n等分或按照比例分为100份,相当于划分100个区间,根据countValue大小当countValue每到达一个等份值时则更新p与n两个参数,使其根据实际数据量增大而改变从而改变numHashFunctions和bitSize;bitSize的大小在
100个区间里的每个区间中它的值是成倍数关系的,这样的倍数关系会改变过滤器bit数组中每个bit位大小的区间;当每个bit位大小的在100个区间中时相当于把过滤器所有的bit位划分了100份相对独立的空间存储;
countValue:记录项目实际过滤或存储的值,初始化为0,根据实际使用数量递增,存放在Redis中保存;
n值:表示预订的过滤值个数,初始化为2000000,以2000000为单位把目标值200000000分100个区段,在项目运行过程中单个区段固定不变;但当countValue的值等于n时,n值就会被重新初始化,重新初始化的值为:n乘2,也就是以n值为基础倍数扩增;
p值:表示可接受的数据过滤误判概率,这个值的生成方法跟n值相同,初始化为
0.0000001,在运行过程中单个区段固定不变;但当countValue的值等于n时,p值就会被重新初始化,重新初始化的值为:p除2;
把p与n两个参数变为动态,删除过滤器的计数器Counter的值根据countValue值到达的区间而等比例增大Counter大小,使得过滤器的每一个阶段拥有自己Counter,实现平衡空间利用率与资源占用的矛盾,保证过滤器的使用效率;
当传入需要删除的value后,根据单个bit位把计数器Counter的值减1,逐个处理;
使numHashFunctions永远不会接近为1,控制到最小值接近或等于3,达到使过滤器的错误率不会降低。
5.根据权利要求4所述的布隆过滤器的过滤方法,其特征在于,所述生成哈希函数个数numHashFunctions和布隆过滤器长度bitSize的具体算法如下:如果算出来的numHashFunctions值小于等于3,则numHashFunctions取固定值3,禁止其小于3。
说明书 :
布隆过滤器系统及过滤方法
技术领域
背景技术
景。
误率也呈现曲线上升,很多公司在解决问题时采用投入更多硬件资源来集群,但是效果也
差强人意且比较耗费成本。
每个bit位都在同一个区间内,当数据量增大后后续生成value值生成相同bit值的概率变
的越来越大,当不同value值得单个bit值重复率变大时,过滤器生成的bit数组相同的概率
会同步增加,这种概率增加对过滤器来说是致命的,应为过滤的目的是处理大量数据的准
确性与可用性,如果过滤器失去了这个属性,则降低了过滤器的实际作用。bitSize的变大
会导致存储在过滤器中的空间更多,对资源占用更大,当存储的value越多时会造成过滤器
的更新/存储、读取的性能变的低下。
重要的情况下,提高过滤器的性能与高可用性变成是唯一的选择。
发明内容
生成多个long类型值,然后将多个long类型值根据bitSize生成多个int类型的bit数组,最
终返回bit数组;
个bit位上,value这个值不存在,调用更新或存储过滤器模块;如果返回的值为1,这value
这个值已经存在,调用删除过滤器模块;
理。
度的int类型值hash1,再用这个long类型值无符号右移>>>32位生成10位长度的int类型值
hash2;
生成多个long类型值,然后将多个long类型值根据bitSize生成多个int类型的bit数组,最
终返回bit数组;
个bit位上,value这个值不存在,调用更新或存储过滤器步骤;如果返回的值为1,这value
这个值已经存在,调用删除过滤器步骤;
理。
度的int类型值hash1,再用这个long类型值无符号右移>>>32位生成10位长度的int类型值
hash2;
响的目的。分区后就可以把公司200000000的数据量切分成100份,这样就相当于只用判定
2000000的小数据量而达到处理大数据量的好处,极大节省了单次处理时间与降低实际滤
误判概率,过滤器会达到更稳定更可靠。不会因为后期数据量大了之后过滤器处理时间长
而拖累其它程序服务使用。在量化效果上用改造后的过滤器比现有过滤器的综合性能快
100倍左右。
附图说明
具体实施方式
人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明
的保护范围。
生成多个long类型值,然后将多个long类型值根据bitSize生成多个int类型的bit数组,最
终返回bit数组;
个bit位上,value这个值不存在,调用更新或存储过滤器模块;如果返回的值为1,这value
这个值已经存在,调用删除过滤器模块;
理。
度的int类型值hash1,再用这个long类型值无符号右移>>>32位生成10位长度的int类型值
hash2;
生成多个long类型值,然后将多个long类型值根据bitSize生成多个int类型的bit数组,最
终返回bit数组;
个bit位上,value这个值不存在,调用更新或存储过滤器步骤;如果返回的值为1,这value
这个值已经存在,调用删除过滤器步骤;
理。
度的int类型值hash1,再用这个long类型值无符号右移>>>32位生成10位长度的int类型值
hash2;
存储过滤器value值、删除数据后删除过滤器value值,各阶段是一个独立机制,但是相互组
成一个闭环整体。
(bitSize)。初始化过滤器是重要步骤,是生成numHashFunctions和bitSize的基础,
numHashFunctions和bitSize是决定过滤器bit位的长度。而过滤器bit位的长度会影响过
滤器最终的查询与更新值的效率与错误率;
都会对应一个key值,使用者如果想知道某个数据时候在过滤器中存在时是需要用这个key
值去过滤器查询的,查询出来true就认为存在,如果为false则认为该值不存在)这三个数
据生成一个value:所述value根据numHashFunctions生成多个long类型值(Long是一个数
据类型,long关键字表示一种长整型数据,是编程语言中的一种基本数据类型,为long int
的缩写,默认为有符号长整型),然后把多个long类型值根据bitSize生成多个int类型的
bit数组,最终返回bit数组;
这个值不存在,如果返回的都为1,这value这个值可能已经存在;所述Redis就是一个存储/
查询数据的一个数据库(也可参考:https://baike.baidu.com/item/Redis/6549233?fr=
aladdin)
numHashFunctions生成的法则为: 可
知,当bitSize在缓慢变大时,numHashFunctions的值是在变小的,直到小于1,但是如果
numHashFunctions的值在接近1或等于1时,计算过滤器bit数组也会越来越小甚至数组长
度为1.这个结果就会导致过滤器的错误率越来越高,失去过滤的意义。改造
numHashFunctions和bitSize生成算法后,使numHashFunctions永远不会接近为1,控制到
最小值接近或等于3,达到使过滤器的错误率不会降低。
countValue,用来存储统计过滤器存放过的value的数量,通过countValue可以知道已经存
放的value总量,按照n等于2亿数据量来切分n,把n等分或按照比例分为100份,相当于划分
100个区间,根据countValue大小当countValue每到达一个等份值时则更新p与n两个参数,
使其根据实际数据量增大而改变从而改变numHashFunctions和bitSize。bitSize的大小在
100个区间里的每个区间中它的值是成倍数关系的,这样的倍数关系会改变过滤器bit数组
中每个bit位大小的区间。当每个bit位大小的在100个区间中时相当于把过滤器所有的bit
位划分了100份相对独立的空间存储达到相互干涉非常少。这样就解决了在公司2亿数据量
甚至更多数据量时,p与n两个参数需要设置非常大,极大影响实际使用过滤器的速度与错
误率攀升的难题,改造后可以实现只用处理200万的数据量的速度与错误率,极大的增加了
在使用过滤器的处理时间,与大大降低了实际错误率,达到实现高可用处理高数据量的能
力。
值的值等于n时,n值就会被重新初始化,重新初始化的值为:n乘2,也就是以n值为基础倍数
扩增
会被重新初始化,重新初始化的值为:p除2
Counter越大就能记录越多的信息。但是越大的Counter需要占用更多的资源,而且在很多
时候会造成极大的空间浪费。但是把p与n两个参数变为动态后,Counter的值可以改造成根
据countValue值到达的区间而等比例增大Counter大小,这样在过滤器的每一个阶段可以
拥有自己Counter,可以实现平衡空间利用率与资源占用的矛盾,保证过滤器的使用效率。
置关系,仅是为了便于描述本申请和简化描述,而不是指示或暗示所指的装置或元件必须
具有特定的方位、以特定的方位构造和操作,因此不能理解为对本申请的限制。
系统、装置及其各个模块以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微
控制器等的形式来实现相同程序。所以,本发明提供的系统、装置及其各个模块可以被认为
是一种硬件部件,而对其内包括的用于实现各种程序的模块也可以视为硬件部件内的结
构;也可以将用于实现各种功能的模块视为既可以是实现方法的软件程序又可以是硬件部
件内的结构。
响本发明的实质内容。在不冲突的情况下,本申请的实施例和实施例中的特征可以任意相
互组合。