sviolet.thistle.model.bitmap.BloomBitmap Maven / Gradle / Ivy
/*
* Copyright (C) 2015-2019 S.Violet
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Project GitHub: https://github.com/shepherdviolet/thistle
* Email: [email protected]
*/
package sviolet.thistle.model.bitmap;
/**
* Bloom Bitmap
*
* 注意, 如果作为布隆过滤器使用, 建议不要使用Bitmap#put方法直接对数据进行操作!
*
* 另外, Redis4.0+ 和 lettuce 支持布隆过滤器.
*
*
* 要点:
* 1.元素只增不减(很难实现删除元素)
* 2.存在误判率, 如果返回true表示大概率存在, 返回false表示一定不存在
* 3.增加哈希算法数量(默认3个)可以减少误判率
* 4.增大Bitmap容量(size)可以减少误判率, 最大建议1000000000(10亿), 约占120M内存
* 5.要对可能塞入的元素数量做预计, 已塞入的元素数量对误判率影响非常大
*
*
*
* 误判率(参考他人文档):
* 容量: 10亿(120Mb) 元素数: 1000万 HASH算法数: 3 误判率: < 0.0001
* 容量: 1亿(12Mb) 元素数: 1000万 HASH算法数: 3 误判率: > 0.01
*
*
*
* 误判率(实测):
* 容量: 10亿(120Mb) 元素数: 1000万 HASH算法数: 3 误判率: < 0.00001
* 容量: 1亿(12Mb) 元素数: 1000万 HASH算法数: 3 误判率: < 0.005
* 容量: 1亿(12Mb) 元素数: 100万 HASH算法数: 3 误判率: < 0.00001
* 容量: 1000万(1Mb) 元素数: 100万 HASH算法数: 3 误判率: < 0.005
*
*
* @author S.Violet
*/
public interface BloomBitmap extends Bitmap {
/**
* 将一个数据添加到布隆过滤器
*
* @param data 数据
*/
void bloomAdd(byte[] data);
/**
* 检查一个数据是否在布隆过滤器中存在
*
* @param data 数据
* @return true:存在(可能存在) false:不存在(一定不存在)
*/
boolean bloomContains(byte[] data);
}