Skip to content

Commit 3b99b05

Browse files
committed
添加布隆过滤器
1 parent 3003423 commit 3b99b05

File tree

6 files changed

+97
-4
lines changed

6 files changed

+97
-4
lines changed

.gitignore

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Created by .ignore support plugin (hsz.mobi)
2+
### Go template
3+
# Binaries for programs and plugins
4+
*.exe
5+
*.exe~
6+
*.dll
7+
*.so
8+
*.dylib
9+
.idea
10+
# Test binary, build with `go test -c`
11+
*.test
12+
13+
# Output of the go coverage tool, specifically when used with LiteIDE
14+
*.out
15+

README.md

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
### recommend_code [推荐算法]基于用户的协同过滤算法
1+
### recommend_code [推荐算法]
2+
1: v1 基于用户的协同过滤算法[杰卡德相似度]
3+
1: user_cf_by_cosine 基于用户的协同过滤算法[余弦夹角]
24

35
### similarity_code [相似度算法]
46
1: jaccard 相似度计算之杰卡德相似度
57
2: cosine 相似度计算之余弦夹角
68
7-
### red_envelope_code [二倍均值法] 可用于用户抢红包等
9+
### average_code [计算平均值]可用于用户抢红包等
10+
1: red_envelope_code [二倍均值法] 可用于用户抢红包等
11+
12+
### bloom_filter_code [布隆过滤器]
13+
1: bloom 布隆过滤器

red_envelope_code.go average_code/red_envelope_code.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package algorithm_coding
1+
package average_code
22

33
import (
44
"fmt"

red_envelope_code_test.go average_code/red_envelope_code_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package algorithm_coding
1+
package average_code
22

33
import "testing"
44

bloom_filter_code/bloom.go

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package bloom_filter_code
2+
3+
import (
4+
"github.com/spaolacci/murmur3"
5+
"github.com/willf/bitset"
6+
)
7+
8+
//计算最佳的配置
9+
//https://hur.st/bloomfilter/
10+
//n代表元素的个数
11+
//p代表假阳率
12+
//m代表位图长度
13+
//k代表hash函数的个数
14+
type BloomFilter struct {
15+
m uint64 //数组集合大小
16+
k uint32 //hash函数个数
17+
b *bitset.BitSet
18+
}
19+
20+
func New(m uint64, k uint32) *BloomFilter {
21+
return &BloomFilter{
22+
m, k, bitset.New(uint(m)),
23+
}
24+
}
25+
26+
func (f *BloomFilter) Add(data []byte) {
27+
for i := uint32(0); i < f.k; i++ {
28+
f.b.Set(f.locate(data, i))
29+
}
30+
}
31+
func (f *BloomFilter) Exist(data []byte) bool {
32+
for i := uint32(0); i < f.k; i++ {
33+
if !f.b.Test(f.locate(data, i)) { //一个不存在就绝对不存在
34+
return false
35+
}
36+
}
37+
return true
38+
}
39+
40+
func (f *BloomFilter) locate(data []byte, seed uint32) uint {
41+
return getHash(data, seed) % uint(f.m)
42+
}
43+
44+
func getHash(data []byte, seed uint32) uint {
45+
m := murmur3.New64WithSeed(seed)
46+
_, _ = m.Write(data)
47+
return uint(m.Sum64())
48+
}

bloom_filter_code/bloom_test.go

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package bloom_filter_code
2+
3+
import (
4+
"github.com/spaolacci/murmur3"
5+
"testing"
6+
)
7+
8+
func TestMurmurNew128(t *testing.T) {
9+
murmur := murmur3.New128()
10+
_, _ = murmur.Write([]byte("1"))
11+
v1, v2 := murmur.Sum128()
12+
t.Log("v1", v1, "v2", v2)
13+
t.Log("v1", v1%100, "v2", v2%100)
14+
}
15+
16+
func TestNew(t *testing.T) {
17+
m := New(3355, 23)
18+
m.Add([]byte("a"))
19+
m.Add([]byte("b"))
20+
m.Add([]byte("c"))
21+
t.Log(m.Exist([]byte("a")))
22+
t.Log(m.Exist([]byte("c")))
23+
t.Log(m.Exist([]byte("d")))
24+
}

0 commit comments

Comments
 (0)