如何快速判断一个key是否存在在亿级数据中(bloomFilters)
面试题
现在有一个非常庞大的数据(亿级),假设全是 int 类型。现在我给你一个数,你需要告诉我它是否存在其中(尽量高效)
分析
采用bloomFilters进行实现(时间&空间尽可能的有效),bloomFilters也常常用在防止缓存穿透,即服务请求在发送到缓存之前,先查找下bloomFilters,检查对应的key是否存在,不存在直接返回;存在再进入到缓存进行查询->DB查询
实现思路:
实际实现采用多次HASH,查看对应数组内存储的值是否为1,多次hash结果均为1,则认为是存在;存在一定的误判率;hash算法尽可能采用一致性hash方式,确保数据分布较为均匀
package com.hero.cases; import com.beust.jcommander.internal.Lists;
import org.junit.Assert;
import org.junit.Test; import java.util.List; /**
* @Des:判断亿级元素是否存在
* @Auther: 飞狐
* @Date: 2019/3/29
*/
public class BloomFilters { /**
* 数组长度
*/
private int arraySize; private int[] array; public BloomFilters(int arraySize){
this.arraySize = arraySize;
array = new int[arraySize];
} /**
* 写入数据(经过3次Hash,把数组对应的位置标识为1)
* @param key
*/
public void add(String key){
int first = hashcode_1(key);
int second = hashcode_2(key);
int third = hashcode_3(key); array[first % arraySize] = 1;
array[second % arraySize] = 1;
array[third % arraySize] = 1;
} public int hashcode_1(String key){
int hash = 0;
int i ;
for(i = 0; i < key.length(); i++){
hash = 33 * hash + key.charAt(i);
}
return Math.abs(hash);
} /**
* FNV1_32_HASH算法
* @param data
* @return
*/
private int hashcode_2(String data){
final int p = 16777619;
int hash = (int) 2166136261L;
for(int i = 0; i < data.length(); i++){
hash = (hash ^ data.charAt(i)) * p;
}
hash += hash << 13;
hash ^= hash >> 7;
hash += hash << 3;
hash ^= hash >> 17;
hash += hash << 5; return Math.abs(hash);
} private int hashcode_3(String key){
int hash,i;
for(hash = 0, i= 0; i < key.length();++i){
hash += key.charAt(i);
hash += (hash << 10);
hash ^= hash >> 6;
}
hash += hash << 3;
hash ^= hash >> 11;
hash += hash << 15;
return Math.abs(hash);
} /**
* 判断元素是否存在
* @param key
* @return
*/
public boolean check(String key){
int first = hashcode_1(key);
int second = hashcode_2(key);
int third = hashcode_3(key); if(array[first % arraySize] == 0){
return false;
} if(array[second % arraySize] == 0){
return false;
} if(array[third % arraySize] == 0){
return false;
}
return true;
} }
运行结果:
检查1: true
检查2: true
检查3: true
检查999999: true
检查400230340: false
执行时间:2261
如何快速判断一个key是否存在在亿级数据中(bloomFilters)的更多相关文章
- zoj 月赛B题(快速判断一个大数是否为素数)
给出一个64位的大数,如何快速判断其是否为素数 #include<algorithm> #include<cstdio> #include<cstring> #in ...
- Java源码中的发现:快速判断一个int值是几位数
判断一个int值是几位数,要是我自己实现,估计又会想到除法和模运算了,偶然在java标准API源码中发现的写法,很强大. public class Test { final static int[] ...
- 一道腾讯面试题:如何快速判断某 URL 是否在 20 亿的网址 URL 集合中?布隆过滤器
何为布隆过滤器 还是以上面的例子为例: 判断逻辑: 多次哈希: Guava的BloomFilter 创建BloomFilter 最终还是调用: 使用: 算法特点 使用场景 假设遇到这样一个问题:一个网 ...
- bitmap-如何判断某个整数是否存在40亿个整数中?
有这样一道面试题:现有40亿个整数,如果再给定一个新的整数,怎么判断这个整数是否在这40亿个整数中? 你可能首先会想到用一个set存储,那个新数只需判断是否在set中.但是如果用set存储的话,如果一 ...
- 判断一个key 是否在map中存在
public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-gener ...
- 判断一个类到底是从哪个jar包中调用的工具类
项目中使用的jar包较多时,会出现jar冲突的情况,有时候很难判断当前使用的这个类是从哪个jar包中调用的.因为一般我们只能看到jar包的名称,不清楚其中的类的目录结构. 这个类的作用就是说明当前调用 ...
- 20 亿的 URL 集合,如何快速判断其中一个?
假设遇到这样一个问题:一个网站有 20 亿 url 存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?并且需在给定内存空间(比如:500M ...
- 两天快速开发一个自己的微信小程序
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Songti SC" } p.p2 { margin: 0.0px 0. ...
- 如何快速开发一个支持高效、高并发的分布式ID生成器
ID生成器是指能产生不重复ID服务的程序,在后台开发过程中,尤其是分布式服务.微服务程序开发过程中,经常会用到,例如,为用户的每个请求产生一个唯一ID.为每个消息产生一个ID等等,ID生成器也是进行无 ...
随机推荐
- Case 条件运算符
Case运算有两种写法,平常用的都比较多,这里只简单复习下,Case的语法帮助里就好,这里我尝试用颜色区分的方式让大家一眼就能了解其结构: 写法一:) select case when PriceTy ...
- Goroutine通信与thread in java间的通信
// This file contains the implementation of Go channels. // Invariants: // At least one of c.sendq ...
- sql server中的varchar和Nvarchar有什么区别?
很多开发者进行数据库设计的时候往往并没有太多的考虑char, varchar类型,有的是根本就没注意,因为存储价格变得越来越便宜了,忘记了最开始的一些基本设计理论和原则,这点让我想到了现在的年轻人,大 ...
- javascript高级程序设计第3版——第6章 面向对象的程序设计
第六章——面向对象的程序设计 这一章主要讲述了:面向对象的语言由于没有类/接口情况下工作的几种模式以及面向对象语言的继承: 模式:工厂模式,构造函数模式,原型模式 继承:原型式继承,寄生式继承,以及寄 ...
- asp.net 跨域访问
摘自 https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests- ...
- 20175212童皓桢 Java实验二-面向对象程序设计实验报告
20175212童皓桢 Java实验二-面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设 ...
- PIL库的运用
PIL库学习及运用 1.库的介绍Python Imaging Library,简称PIL python图像处理库,这个库支持多种文件格式,并提供了强大的图像处理和图形处理能力. 下面是我的学习笔记 首 ...
- 利用content为伊特元素追加三个小点
案例代码: <span class="seven"></span> <style type="text/css"> .sev ...
- java 8 Lambda
警告: 初学者随笔, 请关闭此网页, 以免浪费你的时间
- C#总结小程序
主要功能 左侧树状图功能 添加,修改,删除 1.添加 点击添加按钮执行点击事件 弹出机窗口之后点击添加 2.删除 点击删除执行下面的单击事件 点击确定即可删除成功. 3.修改