首页 > 其他分享 >Golang布隆过滤器升级版

Golang布隆过滤器升级版

时间:2023-11-11 20:33:23浏览次数:27  
标签:bf int 布隆 Golang 哈希 hashNum bitArray BloomFilter 升级版

作用:平常使用的布隆过滤器可以用来过滤Redis空数据,避免缓存穿透。

升级点:将原本的bool数组位更改为int数组,实现便于删除操作的场景。
代码如下:

package main

import (
	"fmt"
)

// BloomFilter 布隆过滤器
type BloomFilter struct {
	bitArray []int //升级版结构 哈希所落位置+1
	hashNum  int   //哈希的数量
}

func NewBloomFilter(bitArray, hashNum int) *BloomFilter {
	return &BloomFilter{
		hashNum:  hashNum,
		bitArray: make([]int, bitArray),
	}
}

// 哈希当前元素
func (t *BloomFilter) hash(value string, seed int) int {
	var result = 0
	for i := 0; i < len(value); i++ {
		result = result*seed + int(value[i])
	}
	//length = 2^n 时,X % length = X & (length - 1)
	return result & (t.hashNum - 1)
}

// 追加哈希布隆过滤器
func (t *BloomFilter) add(item string) {
	//哈希当前元素
	for i := 0; i < t.hashNum; i++ {
		//追加当前哈希数量
		idx := t.hash(item, i) % len(t.bitArray)
		t.bitArray[idx]++
	}
}

// 删除哈希布隆过滤器
func (t *BloomFilter) delete(item string) {
	for i := 0; i < t.hashNum; i++ {
		//出现落空直接返回不存在
		idx := t.hash(item, i) % len(t.bitArray)
		if t.bitArray[idx] > 0 {
			t.bitArray[idx]--
		}
	}
}

// 判断元素是否在布隆过滤器
func (t *BloomFilter) contains(item string) bool {
	for i := 0; i < t.hashNum; i++ {
		//出现落空直接返回不存在
		idx := t.hash(item, i) % len(t.bitArray)
		if t.bitArray[idx] == 0 {
			return false
		}
	}
	return true
}

func main() {
	bf := NewBloomFilter(26, 5)

	//追加元素
	bf.add("测试")
	bf.delete("测试")
	bf.add("哈哈")
	bf.delete("哈哈")

	fmt.Println(bf.contains("测试"))
	fmt.Println(bf.contains("哈哈"))
	fmt.Println(bf.bitArray)
}

 

标签:bf,int,布隆,Golang,哈希,hashNum,bitArray,BloomFilter,升级版
From: https://www.cnblogs.com/jichenghui/p/17826312.html

相关文章

  • 想入坑golang web,向大佬们请教些问题?
    当你准备入坑Go语言的Web开发时,以下是一些常见的问题,你可以向大佬们请教:如何设置和启动一个GoWeb服务器?Go语言有哪些常用的Web开发框架?它们之间有什么区别和优劣势?Go语言中的路由是如何实现的?如何处理不同的HTTP请求方法和URL参数?Go语言如何处理请求和响应,以及如何......
  • golang json 序列化、反序列化 字符串反序列化
    golangjson序列化、反序列化字符串反序列化在使用Golang进行开发时,经常会遇到需要将一段JSON字符串进行序列化和反序列化的情况。JSON是一种轻量级数据交换格式,常用于前后端数据传输、存储等场景。Golang提供了内置的encoding/json包来处理JSON的序列化和反序列化。JSON的序列化......
  • 基于Golang协程实现流量统计系统项目开发
    基于Golang协程实现流量统计系统项目开发上一节课我们已经架设好了一个网站。,但是因为我们的网站没有流量。也生成不了大量的日志,靠我们自己点击生成那点日志也不够测试的。所以这次我们就用GO语言批量生成我们想要的日志。好了。我们开始写代码我用的IDE工具是GOLAND,没有为......
  • Golang使用nats
    nats自行安装packagemainimport( "fmt" "github.com/nats-io/nats.go")////nats-server在管理subject的时候是通过’.’进行分割的,server底层是使用treemodule分层管理subject.此处有两个通配符*和>。////*可以匹配以.分割的一切。如:////nc.Subscribe("aa.*......
  • Golang struct 结构体注意事项和使用细节
    结构体所有字段在内存当中是连续的typePointstruct{ x,yint}typeRectstruct{ leftUp,rightDownPoint}funcmain(){ //r1会在内存当中有四个整数 r1:=Rect{ leftUp:Point{ x:1, y:2, }, rightDown:Point{ x:3, y:4, }, } //r1有......
  • Golang锁简单使用
    golang主要有两种锁:互斥锁和读写锁互斥锁Mutex用于提供一种加锁机制(LockingMechanism),保证同一时刻只有一个goroutine在临界区运行packagemainimport( "fmt" "sync" "time")funcmain(){ varmutexsync.Mutex x:=0 gofunc(){ mutex.Lock() x=x+1......
  • Golang服务端断线重连
    断线重连的逻辑很简单,就是把用户存到服务器内存中,当客户端再次登录的时候,判断内存中是否有用户的值,有的话替换packagemainimport( "fmt" "github.com/gorilla/websocket" "log" "net/http" "sync" "time")typeClientstruct{ conn*we......
  • Golang使用crontab
    要是记不住crontab格式,就去网上生成,在线crontab有很多。例如https://www.pppet.net/packagemainimport( "fmt" "github.com/robfig/cron/v3" "time")/**第一个*:second,范围(0-60)第二个*:min,范围(0-59)第三个*:hour,范围(0-23)第四个*:dayofmonth,......
  • 洛谷内卷监视工具(升级版)
    较原版内卷监视工具,增加了一下功能:计分板(宏观掌控他人的卷题数量和难度分布)多次连续AC相同题目去重可能会不定时更新有什么建议可以提出varuserlist=["ricky_lin","Query_Failed","The_Last_Candy","Jeefy","Rairn","hfjh","fsfdgdg","aish......
  • beego框架 golang web框架-网上花店
    beego框架golangweb框架-网上花店beego网上花店功能介绍主页商品列表展示商品详情用户登录注册购买购物车评价用户中心订单列表后台管理页商品管理添加修改删除商品用户管理添加删除用户网上花店功能比较简单适合刚接触beego的初学者使用技术beego框架My......