mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
86 lines
2.4 KiB
V
86 lines
2.4 KiB
V
module datatypes
|
|
|
|
import hash
|
|
|
|
fn hash_func(s string) u32 {
|
|
val64 := hash.sum64_string(s, 0x12345678)
|
|
return u32(val64)
|
|
}
|
|
|
|
fn test_bloom_filter_fast() {
|
|
mut b := new_bloom_filter_fast[string](hash_func)
|
|
b.add('hello world')
|
|
b.add('v is awsome')
|
|
b.add('power by v')
|
|
assert b.exists('hello world') == true
|
|
assert b.exists('v is awsome') == true
|
|
assert b.exists('power by v') == true
|
|
assert b.exists('my world') == false
|
|
}
|
|
|
|
fn test_bloom_filter_fast_normal() {
|
|
mut b := new_bloom_filter[string](hash_func, 65536, 16) or { panic(err) }
|
|
b.add('hello world')
|
|
b.add('v is awsome')
|
|
b.add('power by v')
|
|
assert b.exists('hello world') == true
|
|
assert b.exists('v is awsome') == true
|
|
assert b.exists('power by v') == true
|
|
assert b.exists('my world') == false
|
|
}
|
|
|
|
fn test_bloom_filter_false_positive() {
|
|
// every `add` will set 8 bits in the table(total length = 16), so overflow very quickly
|
|
mut b := new_bloom_filter[string](hash_func, 16, 8) or { panic(err) }
|
|
b.add('hello world')
|
|
b.add('v is awsome')
|
|
b.add('power by v')
|
|
assert b.exists('hello world') == true
|
|
assert b.exists('v is awsome') == true
|
|
assert b.exists('power by v') == true
|
|
assert b.exists('my world') == true // false positive
|
|
}
|
|
|
|
fn test_bloom_filter_fast_union_intersection() {
|
|
mut a := new_bloom_filter_fast[string](hash_func)
|
|
mut b := new_bloom_filter_fast[string](hash_func)
|
|
|
|
a.add('power by v')
|
|
a.add('silly c')
|
|
a.add('super rust')
|
|
|
|
b.add('hello world')
|
|
b.add('v is awsome')
|
|
b.add('power by v')
|
|
|
|
assert a.exists('power by v') == true
|
|
assert a.exists('silly c') == true
|
|
assert a.exists('super rust') == true
|
|
assert a.exists('power c++') == false
|
|
|
|
assert b.exists('hello world') == true
|
|
assert b.exists('v is awsome') == true
|
|
assert b.exists('power by v') == true
|
|
assert b.exists('my world') == false
|
|
|
|
// a || b test
|
|
mut c := a.@union(b) or { panic(err) }
|
|
assert c.exists('silly c') == true
|
|
assert c.exists('super rust') == true
|
|
assert c.exists('power c++') == false
|
|
assert c.exists('hello world') == true
|
|
assert c.exists('v is awsome') == true
|
|
assert c.exists('power by v') == true
|
|
assert c.exists('my world') == false
|
|
|
|
// a && b test
|
|
mut d := a.intersection(b) or { panic(err) }
|
|
assert d.exists('silly c') == false
|
|
assert d.exists('super rust') == false
|
|
assert d.exists('power c++') == false
|
|
assert d.exists('hello world') == false
|
|
assert d.exists('v is awsome') == false
|
|
assert d.exists('power by v') == true
|
|
assert d.exists('my world') == false
|
|
}
|