一、位图简介
用二进制的每一位来压缩存放很多数据的状态,通常用于判断某个数据是否存在。如果某个数字存在就在对应位置置为1,比如标识0、8、22三个数字存在。
位图的大小取决于要存放的数据范围,数据到下标的对应关系需自行设计,超过32位可分段存储。
二、位图常见操作
2.1 采用位运算快速将某个位置置为1
采用按位或
int bitMap;
public void setBit(int pos) {
int bit = 1 << pos;
bitMap |= bit;
}
采用按位异或
调用两次的话即可将对应位置清0
int bitMap;
public void setBit(int pos) {
int bit = 1 << pos;
bitMap ^= bit;
}
2.2 判断某数字是否存在(判断某位置是否为1)
按位与结果为0表示不存在
int bitMap;
public bool exist(int pos) {
int bit = 1 << pos;
return bitMap & bit != 0;
}
三、布隆过滤器 BloomFilter
3.1 布隆过滤器简介
布隆(Burton Howard Bloom)1970年提出,由一个很长的二进制向量和一系列随机映射函数组成,用于检索一个元素是否在一个集合中。
3.2 优点、缺点及应用
优点:
• 空间利用率高,查询效率快,不保存数据本身安全性好
• 不存在漏报(实际存在的元素不会被检测为不存在)
缺点:
• 有一定的误判率(实际不存在的元素被检测为存在)
• 删除困难
应用场景:
防缓存击穿(数以十亿级别数据量)
3.3 应用举例
对url做过滤排重,检查我们的系统中该域名是否存在