JS实现一个布隆过滤器
之前专门聊过令牌桶算法,而类似的方案还有布隆过滤器。它一般用于高效地查找一个元素是否在一个集合中。
用js实现如下所示:
class BloomFilter {
constructor(size, hashFunctions) {
this.size = size;
this.bitArray = new Array(size).fill(0);
this.hasFunctions = hashFunctions;
}
add(item) {
for (let i = 0; i < this.hasFunctions.length; i++) {
const index = this.getHash(this.hasFunctions[i], item) % this.size;
this.bitArray[index] = 1;
}
}
contain(item) {
for (let i = 0; i < this.hasFunctions.length; i++) {
const index = this.getHash(this.hasFunctions[i], item) % this.size;
if (this.bitArray[index] === 0) return false;
}
return true;
}
getHash(hasFunction, item) {
return hasFunction(item);
}
}
const basicHashFunction = (item) => {
// Transform the item to string
const chars = String(item);
let hash = 0;
// Perform a simple hash calculation on each character in the string
for (let i = 0; i < chars.length; i++) {
hash = (hash << 5) + chars.charCodeAt(i); // combination of the bit operations and character ending
hash = hash & hash;
hash = Math.abs(hash);
}
return hash;
}
const secondHashFunction = (item) => {
let hash = 0;
for (let i = 0; i < item.length; i++) {
const char = item.charCodeAt(i);
hash = (hash << 5) - hash + char;
}
return hash;
}
// usage
const hashFunctions = [basicHashFunction, secondHashFunction];
const bloomFilter = new BloomFilter(1000, hashFunctions);
bloomFilter.add("item01");
bloomFilter.add("item02");
console.log(bloomFilter.contain("item02")); // output: true
console.log(bloomFilter.contain("item02")); // output: false
在上述代码中我们通过多个哈希函数计算元素的哈希值,减少哈希冲突问题。哈希函数还可以用第三方库,不一定非要自己实现,我给出的都是一些简单实现。
布隆过滤器有很多应用场景:
- 防止缓存穿透。判断数据是否在缓存中,以免不走缓存。
- 优化数据库请求。
- 防止恶意访问。如果该请求ip已经在保存恶意IP的布隆过滤器中,则阻止该请求。
JS实现一个布隆过滤器的更多相关文章
- 浅谈redis的HyperLogLog与布隆过滤器
首先,HyperLogLog与布隆过滤器都是针对大数据统计存储应用场景下的知名算法. HyperLogLog是在大数据的情况下关于数据基数的空间复杂度优化实现,布隆过滤器是在大数据情况下关于检索一个元 ...
- 浅谈布隆过滤器Bloom Filter
先从一道面试题开始: 给A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL. 这个问题的本质在于判断一个元素是否在一个集合中.哈希表以O(1) ...
- Redis解读(4):Redis中HyperLongLog、布隆过滤器、限流、Geo、及Scan等进阶应用
Redis中的HyperLogLog 一般我们评估一个网站的访问量,有几个主要的参数: pv,Page View,网页的浏览量 uv,User View,访问的用户 一般来说,pv 或者 uv 的统计 ...
- 布隆过滤器的概述及Python实现
布隆过滤器 布隆过滤器是一种概率空间高效的数据结构.它与hashmap非常相似,用于检索一个元素是否在一个集合中.它在检索元素是否存在时,能很好地取舍空间使用率与误报比例.正是由于这个特性,它被称作概 ...
- 【转】Bloom Filter布隆过滤器的概念和原理
转自:http://blog.csdn.net/jiaomeng/article/details/1495500 之前看数学之美丽,里面有提到布隆过滤器的过滤垃圾邮件,感觉到何其的牛,竟然有这么高效的 ...
- 布隆过滤器(Bloom Filter)详解——基于多hash的概率查找思想
转自:http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html 布隆过滤器[1](Bloom Filter)是由布隆(Burton ...
- 布隆过滤器(Bloom Filter)的原理和实现
什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, ...
- 布隆过滤器(Bloom Filter)
一.布隆过滤器介绍 Bloom Filter是一种空间效率很高的随机数据结构,Bloom Filter可以看做是对bit-map的扩展,它的原理如下: 当一个元素被加入集合时,通过K个Hash函数将这 ...
- Bloom Filter(布隆过滤器)
布隆过滤器用于测试某一元素是否存在于给定的集合中,是一种空间利用率很高的随机数据结构(probabilistic data structure),存在一定的误识别率(false positive),即 ...
- 布隆过滤器(BoomFilter)
1.原理: a.解决的问题: 判断一个元素是否在一个集合中 b.Hash表的特点: i.快速准确 ...
随机推荐
- Kubernetes 权限管理
1. 概述 Kubernetes 中用户分登陆用户和 service account.登陆用户可通过 kubectl config 查看上下文,以及当前上下文: [root@chunqiu ~ (Ma ...
- SD 控制器集成需求和寄存器列表
AHB Bus SD Bus DFT & Interrupt 控制集成需求 功能列表 控制器框架图 顶层信号 硬件集成环境 寄存器描述
- 0xGame 2023【WEEK2】Crypto全解
中间的那个人 题目信息 from secret import flag from Crypto.Util.number import * from Crypto.Cipher import AES f ...
- SSM整合 - 环境配置
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- Mygin 实现简单Http
本篇是完全参考gin的功能,自己手动实现一个类似的功能,帮助自己理解和学习gin框架 目的 简单介绍net/http库以及http.Handler接口 实现简单的功能 标准库启动Web服务 impor ...
- [转帖]命令行参数--与-D的区别
https://juejin.cn/post/7238420276228341815 Spring Boot 学习笔记 我们要想了解这两者之间的差异,首先来看一个案例: bash 复制代码 # ...
- [转帖]oracle通过pid查找执行SQL
通过TOP 命令查看PID:1560 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1560 oracle 20 0 38.978g 0. ...
- 关于decimal非常浅显的学习与整理
关于decimal非常浅显的学习与整理 背景知识 整数,小数,浮点,定点 整数(Integer)是没有小数部分的数值,可以是正数.负数或零.在计算机中,整数通常以二进制形式存储. 小数(Decimal ...
- [转帖]MinIO Client(mc)完全指南
https://www.cnblogs.com/lvzhenjiang/p/14944821.html 目录 一.获取MinIO Client(mc) 1.1 docker版 1.2 Homebrew ...
- [转帖]Megacli 错误码
MegaCLI Error Messages 0x00 Command completed successfully 0x01 Invalid command 0x02 DCMD opcode is ...