HashMap和布隆过滤器命中性能测试
package datafilter;
import com.google.common.base.Stopwatch;
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import java.util.*;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.NANOSECONDS;
public class WarnIp {
public static String getRandomIp() {
// 需要排除监控的ip范围
int[][] range = { { 607649792, 608174079 }, // 36.56.0.0-36.63.255.255
{ 1038614528, 1039007743 }, // 61.232.0.0-61.237.255.255
{ 1783627776, 1784676351 }, // 106.80.0.0-106.95.255.255
{ 2035023872, 2035154943 }, // 121.76.0.0-121.77.255.255
{ 2078801920, 2079064063 }, // 123.232.0.0-123.235.255.255
{ -1950089216, -1948778497 }, // 139.196.0.0-139.215.255.255
{ -1425539072, -1425014785 }, // 171.8.0.0-171.15.255.255
{ -1236271104, -1235419137 }, // 182.80.0.0-182.92.255.255
{ -770113536, -768606209 }, // 210.25.0.0-210.47.255.255
{ -569376768, -564133889 }, // 222.16.0.0-222.95.255.255
};
Random rdint = new Random();
int index = rdint.nextInt(10);
String ip = num2ip(range[index][0] + new Random().nextInt(range[index][1] - range[index][0]));
return ip;
}
/*
* 将十进制转换成IP地址
*/
public static String num2ip(int ip) {
int[] b = new int[4];
String x = "";
b[0] = (int) ((ip >> 24) & 0xff);
b[1] = (int) ((ip >> 16) & 0xff);
b[2] = (int) ((ip >> 8) & 0xff);
b[3] = (int) (ip & 0xff);
x = Integer.toString(b[0]) + "." + Integer.toString(b[1]) + "." + Integer.toString(b[2]) + "." + Integer.toString(b[3]);
return x;
}
private static Map<String, Integer> map = new HashMap<>();
private static BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.unencodedCharsFunnel(), 1000000);
private static List<String> list = new ArrayList<>();
static {
int count = 100000000;
for (int id = 0; id < count; id++) {
String randomIp = getRandomIp();
int randomPort = (int)(Math.random() * 65536);
String key = randomIp + ":" + randomPort;
if(!map.containsKey(key)) {
System.out.println("key: " + key);
map.put(key, id);
list.add(key);
bloomFilter.put(key);
}
if(map.size() >= 1000000) {
break;
}
}
}
static Stopwatch stopwatch = Stopwatch.createUnstarted();
public static void main(String[] args) {
System.out.println("map.size: " + map.size());
Scanner scanner = new Scanner(System.in); //String param = "222.17.204.104:8001";
while(scanner.hasNextLine()) {
String param = scanner.nextLine();
System.out.println("Input: " + param);
if("exit".equalsIgnoreCase(param)) {
break;
}
stopwatch.start();
// if (map.containsKey(param)) { //map判断
// if(list.contains(param)) {
if (bloomFilter.mightContain(param)) { //布隆过滤器判断(默认3%误差率)
System.out.println("list集合存在该数据=============数据: " + param);
}
//计时结束
stopwatch.stop();
System.out.println("list集合测试,判断该元素集合中是否存在用时: " + stopwatch.elapsed(MILLISECONDS));
System.out.println("list集合测试,判断该元素集合中是否存在用时: " + stopwatch.elapsed(NANOSECONDS));
stopwatch.reset();
}
scanner.close();
}
}
结论:100w数据,key都是字符串(ip:port),map测试时,key存在大概耗时0.01-0.1ms,不存在时大概0.005ms左右,list耗时20-40ms,布隆过滤器0.01-0.2ms左右。除此之外需要考虑占用内存,按255.255.255.255:65535来考虑,用list存储100w条21字节*1000000约20M,布隆过滤器占用更小。
HashMap和布隆过滤器命中性能测试的更多相关文章
- 布隆过滤器的概述及Python实现
布隆过滤器 布隆过滤器是一种概率空间高效的数据结构.它与hashmap非常相似,用于检索一个元素是否在一个集合中.它在检索元素是否存在时,能很好地取舍空间使用率与误报比例.正是由于这个特性,它被称作概 ...
- 浅析布隆过滤器及实现demo
布隆过滤器 布隆过滤器(Bloom Filter)是一种概率空间高效的数据结构.它与hashmap非常相似,用于检索一个元素是否在一个集合中.它在检索元素是否存在时,能很好地取舍空间使用率与误报比例. ...
- 基于Java实现简化版本的布隆过滤器
一.布隆过滤器: 布隆过滤器(Bloom Filter)是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率 ...
- 算法初级面试题05——哈希函数/表、生成多个哈希函数、哈希扩容、利用哈希分流找出大文件的重复内容、设计RandomPool结构、布隆过滤器、一致性哈希、并查集、岛问题
今天主要讨论:哈希函数.哈希表.布隆过滤器.一致性哈希.并查集的介绍和应用. 题目一 认识哈希函数和哈希表 1.输入无限大 2.输出有限的S集合 3.输入什么就输出什么 4.会发生哈希碰撞 5.会均匀 ...
- BloomFilter布隆过滤器
BloomFilter 简介 当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1.检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些 ...
- HBase之八--(3):Hbase 布隆过滤器BloomFilter介绍
布隆过滤器( Bloom filters) 数据块索引提供了一个有效的方法,在访问一个特定的行时用来查找应该读取的HFile的数据块.但是它的效用是有限的.HFile数据块的默认大小是64KB,这个大 ...
- BloomFilter布隆过滤器使用
从上一篇可以得知,BloomFilter的关键在于hash算法的设定和bit数组的大小确定,通过权衡得到一个错误概率可以接受的结果. 算法比较复杂,也不是我们研究的范畴,我们直接使用已有的实现. go ...
- 使用BloomFilter布隆过滤器解决缓存击穿、垃圾邮件识别、集合判重
Bloom Filter是一个占用空间很小.效率很高的随机数据结构,它由一个bit数组和一组Hash算法构成.可用于判断一个元素是否在一个集合中,查询效率很高(1-N,最优能逼近于1). 在很多场景下 ...
- SpringBoot(18)---通过Lua脚本批量插入数据到Redis布隆过滤器
通过Lua脚本批量插入数据到布隆过滤器 有关布隆过滤器的原理之前写过一篇博客: 算法(3)---布隆过滤器原理 在实际开发过程中经常会做的一步操作,就是判断当前的key是否存在. 那这篇博客主要分为三 ...
随机推荐
- 深入理解js闭包【写的通俗易懂,很值的阅读】
详细内容在下面这个链接里面: https://www.cnblogs.com/uedt/archive/2010/10/28/1863389.html 能写出这样的文章,定是大佬!
- win32 socket 编程(一)——TCP/IP
一.基本概念 a) 同步:指发送方发出数据后,等收到接收方发回的响应,才发下一个数据包的通信方式. nb)异步:指的是发送方不等接收方响应,便接着发下个数据包的通信方式. c) 阻塞:指调用某函数时, ...
- python常用函数 Y
yield有点像return,但他会在下一次执行的时候从上次结束点继续执行,带有 yield 的函数在 Python 中被称之为 generator(生成器),生成器无法通过索引获取数据,同时也承诺使 ...
- amqp 抓包 不要在同一台机器
- arm算力
arm 算力运算 MIPS: Million Instructions executed Per SecondDMIPS: Dhrystone Million Instructions execute ...
- Vue.js 技术揭秘学习 (3) render
Vue 的 _render 方法是实例的一个私有方法,它用来把实例渲染成一个虚拟 Node ,返回的是一个VNode 在 Vue 的官方文档中介绍了 render 函数的第一个参数是 createE ...
- 前端每日实战:91# 视频演示如何用纯 CSS 创作一个行驶中的火车 loader
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/RBLWzJ 可交互视频 此视频是可 ...
- 谈谈vue双向数据绑定问题
vue是MVVM模型,vueObserver 数据监听器,把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用Object.define ...
- RabbitMQ核心概念和AMQP协议(二)
RabbitMQ是什么? RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议,在完全不同的应用之间共享数据,RabbirMQ是使用Erlang语言来编写的,并且RabbitMQ是基于A ...
- vue定义组件
1.定义组件 2.在App.vue里引入Home组件 home代码 <template> <div>home</div> </template> < ...