bloom过滤器源码实现

mysql布隆过滤器源码_布隆过滤器(Bloom Filter)的原理和实现 什么情况下需要布隆过滤器?先来看几个比较常见的例子字处理软件中,需要检查一个英语单词是否拼写正确在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上在网络爬虫里,一个网址是否被访问过yahoo, gmail等邮箱垃圾邮件过滤功能这几个例子有一个共同的特点:如何判断一个元素是否存在一个集合中?常规思路数组链表树、平衡二叉树、TrieMap (红黑树)哈希表虽然上面描述的这几种数据结构配合常见的排序、二分... 阅读详情

bloom过滤器源码实现

package com.jd.risk.faketext.udf;

import java.nio.charset.Charset;
import java.util.BitSet;

public class BloomFilter<E> {
    private BitSet bitset;
    private int expectedNumElems, bitSetSize, numAddedElems, k;
    private double bitsPerElem;

    static final Charset charset = Charset.forName("UTF-8");

    public BloomFilter(double falsePositiveProbability, int expectedNumElems) {
        this.bitsPerElem = Math.ceil(-(Math.log(falsePositiveProbability) / Math.log(2))) / Math.log(2);
        this.expectedNumElems = expectedNumElems;
        this.k = (int) Math.ceil(-(Math.log(falsePositiveProbability) / Math.log(2)));
        this.bitSetSize = (int) Math.ceil(this.bitsPerElem * this.expectedNumElems);
        this.bitset = new BitSet(this.bitSetSize);
        numAddedElems = 0;
    }

    public int[] createHashes(byte[] data, int hashes) {
        int[] result = new int[hashes];
        int hash1 = murmurHash32(data, data.length, 0);
        int hash2 = murmurHash32(data, data.length, hash1);
        for (int i = 0; i < hashes; i++) {
            result[i] = Math.abs((hash1 + i * hash2) % this.bitSetSize);
        }
        return result;
    }

    private int murmurHash32(byte[] data, int length, int seed) {
        int m = 0x5bd1e995, r = 24, h = seed^length;
        for (int i = 0; i < length/4; i++) {
            int k = (data[i*4+0]&0xff) +((data[i*4+1]&0xff)<<8)
                    +((data[i*4+2]&0xff)<<16) +((data[i*4+3]&0xff)<<24);
            k *= m;
            k ^= k >>> r;
            k *= m;
            h *= m;
            h ^= k;
        }
        switch (length % 4) {
            case 3: h ^= (data[(length&~3) +2]&0xff) << 16;
            case 2: h ^= (data[(length&~3) +1]&0xff) << 8;
            case 1: h ^= (data[length&~3]&0xff);
                h *= m;
        }
        h ^= h >>> 13;
        h *= m;
        h ^= h >>> 15;
        return h;
    }

    public double expectedFalsePositiveProbability() {
        return getFalsePositiveProbability(expectedNumElems);
    }

    public double getFalsePositiveProbability() {
        return getFalsePositiveProbability(numAddedElems);
    }

    public double getFalsePositiveProbability(double numElems) {
        return Math.pow((1 - Math.exp(-k * (double) numElems / (double) bitSetSize)), k);
    }

    public void add(E element) {
        byte[] bytes = element.toString().getBytes(charset);
        int[] hashes = createHashes(bytes, k);
        for (int hash : hashes) {
            bitset.set(hash, true);
        }
        numAddedElems++;
    }

    public boolean contains(E element) {
        byte[] bytes = element.toString().getBytes(charset);
        int[] hashes = createHashes(bytes, k);
        for (int hash : hashes) {
            if (!bitset.get(hash)) return false;
        }
        return true;
    }

    public void clear() {
        bitset.clear();
        numAddedElems = 0;
    }

    public double getExpectedBitsPerElement() {
        return this.bitsPerElem;
    }

    public double getBitsPerElement() {
        return this.bitSetSize / (double) numAddedElems;
    }

    public int getK() {
        return this.k;
    }

    public int size() {
        return this.bitSetSize;
    }

    public int count() {
        return this.numAddedElems;
    }

    public void testing() {
        System.out.println("jenkins test");
    }


    public static void main(String[] args) {
        BloomFilter bm = new BloomFilter<String>(0.001, 10000000);
        bm.add("astron");
        bm.add("astron1");
        System.out.println(bm.contains("astron"));

    }
}
Java架构/如何判断一个元素在亿级数据中是否存在? 前言 最近有朋友问我这么一个面试题目: 现在有一个非常庞大的数据,假设全是 int 类型。现在我给你一个数,你需要告诉我它是否存在其中(尽量高效)。 需求其实很清晰,只是要判断一个数据是否存在即可。 但这里有一个比较重要的前提:非常庞大的数据。 常规实现 先不考虑这个条件,我们脑海中出现的第一种方案是什么? 我想大多数想到的都是用 HashMap 来存放数据,因为它的写入查询的效率都比较高。 写入和判断元素是否存在都有对应的 API,所以实现起来也比较简单。 为此我写了一个单测,利用 Ha 阅读详情

相关推荐

BLOOM原理与代码实例讲解

1. 背景介绍 BLOOM(Bloom Filter)是一种概率数据结构,用于检测一个元素是否在一个集合中。它的特点是空间效率高、查询速度快,但存在一定的误判率。BLOOM在很多场景下都有广泛的应用,如网络爬虫、数据库查询、缓存系统等。 2. 核心概念与联系 BLOOM的核心概念是哈希函数

AI架构师小马 1042

布隆过滤器(Bloom Filter)详解,以及Java代码实现

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难

masetLI的博客 5694

Java:实现支持任何哈希函数的通用bloom过滤器算法(附完整源码)

Java:实现支持任何哈希函数的通用bloom过滤器算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 397

【经典算法实现 21】Bloom过滤器 C代码实现

【经典算法实现 21】Bloom过滤器 C代码实现一、完整代码二、运行结果 本文主要是使用 C语言来实现一个简单的Bloom过滤器算法, 有关Bloom Filter的原理请参考《Bloom过滤器》 一、完整代码 #include <stdio.h> #include <stdlib.h> #include <stdarg.h> // 可变参数 #define MAX_BIT 100 // 定义 Bloom 数组的 bit 数 #define CHAR_BI

|~~~热爱生活、努力学习的小伙汁~~~| 751

bloomfilter:简单的bloom过滤器实现

Bloom过滤器的C++实现

Bloom Filter的原理与C++实现,并利用Bloom Filter实现简单的词典,进行字词查询

【布隆过滤器】的三种实现方式

布隆过滤器的三种实现方式。

GuLuZaizzz的博客 1690

uniapp 基于单选框多选框实现上拉触底多选/单选、回显

showPickerCheckbox弹层显示 label和value 类似下拉框的label和value一个意思 键和值。结果:可以传接口(接口只能post请求) 可以搜索 下面是结果图片展示 单选多选都可以。fieldValue回显传的值 传的是字符串 数组的话[1,2]转为1,2格式传入。mode是控制的单选还是多选 true为多选默认值 其余参数 单选多选一样。fieldName字段名 确定后会返回该字段名 根据字段名找对应的传入值。问题:在uniapp上 实现分页多选的操作。下面是组件的完整代码。

2301_76607997的博客 2936

布隆过滤器的原理和应用场景

而以某宝为例,即使在用户不登录的情况下,它是需要有一些开放的API供未登录用户去看的,如“/product/{id}”,表示界面上对应的商品。既然id是指商品的标识符,那我不断输入不存在的商品id,而Redis又发现缓存中没有这样的id,就会转向数据库作请求,如此这般,便造成了。上面提到的缓存穿透,总结来讲是指在缓存中找不到所需的数据,导致每次请求都需要访问数据库或其他数据源,从而造成系统负担过大。: 当缓存中的数据更新时,需要相应地更新布隆过滤器中的信息,以确保布隆过滤器的准确性。位数组通常用于紧凑地。

Kristabo的博客 728

使用moveit中的报错及解决

1.fatal error: moveit/move_group_interface/move_group.h: 没有那个文件或目录。// #include <moveit/move_group_interface/move_group.h> 改为。问题1 moveit/move_group_interface/move_group.h: 没有那个文件或目录。在运行c++程序时报错。

qq_60566155的博客 2285

Linux V4L2驱动开发实战:手把手教你用I2C摄像头Sensor注册一个v4l2_subdev

本文详细解析了Linux V4L2驱动开发中I2C摄像头Sensor注册v4l2_subdev的全流程,包括初始化、操作集填充、异步匹配等关键环节。通过实战案例和代码示例,帮助开发者掌握V4L2子系统下的摄像头驱动开发技巧,提升嵌入式Linux系统开发能力。

weixin_30328063的博客 418

Java:实现支持任何哈希函数的通用bloom过滤器算法(附带源码)

Java:实现支持任何哈希函数的通用bloom过滤器算法(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1264

⑩电子产品拆解分析-家用无线遥控开关433Mhz

①免布线随意贴,装上就能使用解决单线开关烦恼;②遥控配对简单,无线通讯距离长,信号可穿墙;

a6662580的博客 4696

Bloom过滤器如何为LSM树加速查询?从Cassandra源码看底层实现

本文分析了Bloom过滤器在LSM树存储引擎中的优化作用,以Apache Cassandra为例,从源码层面解析其实现原理。Bloom过滤器通过无假阴性特性快速过滤不包含目标数据的SSTable,减少无效IO。文章详细阐述了其在SSTable构建时的初始化过程、基于Murmur哈希的分区键写入逻辑,以及查询时的多级过滤机制。同时探讨了假阳性监控与参数调优的重要性,以及如何与LSM树层级结构协同提升查询效率。Bloom过滤器通过内存换IO的方式,有效解决了LSM树查询性能的痛点。

qq_42773076的博客 953

某勾网之登录过程逆向

拉勾网的登录过程逆向,包含请求头(X-S-HEADER、X-K-HEADER、X-SS-REQ-HEADER等) 以及 请求参数/返回数据的加解密。

shanf7921的博客 3万+

【3天快速入门WPF】8-数据绑定基础

以下是一个简单的 WPF 数据绑定示例,使用两个TextBox控件分别表示Name和Age来进行进行数据绑定试验。运行程序后,你会看到初始界面中TextBox 中显示初始名字 “张三”,TextBox 中显示初始年龄 “25”。在 XAML 中创建一个简单的界面,包含一个 TextBox 用于输入名字,一个 TextBox 用于显示年龄。当你在 TextBox 中修改名字时,Person 对象的 Name 属性会被自动更新,反之亦然。它的主要作用是为控件及其子控件提供一个默认的数据源,用于数据绑定。

Zy100Papa的博客 969

mysql布隆过滤器源码_布隆过滤器(Bloom Filter)Java实现

import java.util.BitSet;/**** @author xkey*/public class BloomFilter {private static final int DEFAULT_SIZE = 2 << 24;//布隆过滤器的比特长度private static final int[] seeds = {3,5,7, 11, 13, 31, 37, 61};/...

weixin_39612540的博客 173

分数间隔均衡器的基本原理及应用(使用Matlab)

通过对接收信号进行加权求和,分数间隔均衡器可以抵消信号在传输过程中受到的频率响应失真。Matlab提供了丰富的工具和函数,可以方便地实现分数间隔均衡器,并进行性能评估。分数间隔均衡器(Fractional Interval Equalizer)是一种数字信号处理技术,用于均衡带通信道中的信号失真。分数间隔均衡器的基本原理是通过对接收信号进行加权求和,以抵消信号在传输过程中受到的频率响应失真。分数间隔均衡器在通信系统中具有广泛的应用。最后,我们通过比较均衡后的信号和发送数据的阈值来进行解调,并计算误码率。

2301_79325657的博客 678

以太坊bloom和logs及代码解析

以太坊 bloom logs getLogs eth_getLogs

cz911005的博客 4801

【制作100个unity实战之2】实现一款简单的FPS游戏

你将学到: fps武器脚本 基础瞄准功能 僵尸敌人AI 巡逻范围 攻击间 搜寻半径 追击 枪声吸引周围的僵尸 击中僵直效果

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3551

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

以太坊源码深入分析(10)-- 以太坊Bloom过滤器实现原理及应用场景分析

上一节分析reciept产生过程的时候提到:reciept会为日志数据生成一个Bloom过滤器,那Bloom过滤器是用来干嘛的呢?有什么用呢? 一,Bloom过滤器的数据结构和reciept创建Bloom的过程 type Bloom [BloomByteLength]byte BloomByteLength = 256 Bloom 就是一个256个字节数组。一共2048位。 我们看看怎么把庞大...

Cypherium-japson 1659

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

完整拆解 Voxtral-Mini-3B-2507-gguf 架构:Whisper 编码器 + 3B 语言模型如何实现语音转文本

Voxtral-Mini-3B-2507-gguf 是 Mistral 开源多语言语音识别模型(ASR,即语音转文本)的 GGUF 量化版本,由 transcribe.cpp 生态维护。它用 Whisper-large-v3 双向音频编码器 + 3B 参数的 Ministral 语言模型,以纯 C++ 推理即可离线完成 8 种语言的语音转文本与语音翻译,Q4 量化后仅 2.98 GB,非常适合新手

gitblog_00778的博客 359

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

实际项目中使用Redis布隆过滤器(bloom filter)

项目中使用redis实现布隆过滤器的几种方式: 先占个位,假期结束回来详细说明。 第一种: redis 安装bloom 过滤器模块, redisTemplate 执行lua 脚本 第二种: redis 安装bloom 过滤器模块, 由于redisTemplate 不支持bloom 过滤器模块的命令,可以修改redisTemplate 框架的Protocol 源码,添加所支持的命令类型 第三种: 使用redisson API 原生支持bloom 过滤器 ...

a469517790的博客 6273

逆向爬虫21 整合Scrapy-Redis-Splash-Bloom功能

整合Scrapy-Redis-Splash-Bloom功能的爬虫

weixin_40743639的博客 1435

爬虫教程( 6 ) --- CrawlSpider、RedisCrawlSpider、Bloom Filter

追踪(CrawlSpider)、过滤(布隆过滤)、去重、解析

freeking101的博客 6558

三步装好 Magisk_AsoulOpt 游戏线程优化模块

Magisk_AsoulOpt 是一个 Android 游戏线程调整模块,它会重新分配指定游戏进程的优先级和系统资源,缓解部分游戏运行中的卡顿。它不改变硬件本身,通常也不会与第三方调度工具冲突。下面是完整的安装和确认流程。 ## 先确认手机和游戏符合安装条件 1. 手机已 root(即获取系统最高权限)并安装 Magisk Manager(面具管理器) 2. 已下载模块 zip 安装包,可对照

gitblog_01098的博客 892
上一篇: 提取前后两个字
下一篇: hive -S -e
dataastron
博客等级 码龄10年 26粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值