Skip to content

Repository files navigation

BloomFilter.NetCore

The Bloom filter is a probabilistic set data structure which is very small. This is achieved by allowing false positives with some probability p. It has an add and contains operation which both are very fast (time complexity O(1)).

There are 2 types of Bloom filters in the Bloom filter library:

  • Regular Bloom filter, a regular in-memory Bloom filter (FilterMemory)
  • Redis Bloom Filter, a Redis-backed Bloom filter which can be concurrently used by different applications (FilterRedis | FilterFreeRedis | FilterCSRedis)

Packages & Status

PackageNuGet
BloomFilter.NetCoreNuGet package
BloomFilter.Redis.NetCoreNuGet package
BloomFilter.CSRedis.NetCoreNuGet package
BloomFilter.FreeRedis.NetCoreNuGet package
BloomFilter.EasyCaching.NetCoreNuGet package

Features

  • Configuration of all parameters: Bit-Array size m, number of hash functions k
  • Automatic configuration given the tolerable false positive rate p and expected elements n
  • Choice among different hash functions: the better (i.e. uniformly distributed) the hash function, the more accurate the Bloom filter but the better the hash function usually the slower it is -> choose from about 10-20 optimized hash functions, e.g. CRC, MD5, SHA, Murmur, LCGs, xxHash etc. or use a custom one
  • Generation of the Bloom filter is always fast
  • Implementation of rejection sampling and chaining of hash values taking into account the avalanche effect (higher hash quality)
  • Concurrency: the Bloom filter can be accessed by many clients simultaneously without multi-user anomalies and performance degradation

Usage

In Memory

publicclassDemo{staticIBloomFilterbf=FilterBuilder.Build(10000000,0.01);publicvoidSample(){bf.Add("Value");Console.WriteLine(bf.Contains("Value"));}}

Configurations

varservices=newServiceCollection();services.AddBloomFilter(setupAction =>{setupAction.UseInMemory();});varprovider=services.BuildServiceProvider();varbf=provider.GetService<IBloomFilter>();bf.Add("Value");Console.WriteLine(bf.Contains("Value"));

Use Redis

publicclassDemo{staticIBloomFilterbf=FilterRedisBuilder.Build("localhost","InstanceName",5000000,0.001);publicvoidSample(){bf.Add("Value");Console.WriteLine(bf.Contains("Value"));}}

StackExchange.Redis

varservices=newServiceCollection();services.AddBloomFilter(setupAction =>{setupAction.UseRedis(newFilterRedisOptions{Name="Redis1",RedisKey="BloomFilter1",Endpoints=new[]{"localhost"}.ToList()});});varprovider=services.BuildServiceProvider();varbf=provider.GetService<IBloomFilter>();bf.Add("Value");Console.WriteLine(bf.Contains("Value"));

CSRedisCore

varservices=newServiceCollection();services.AddBloomFilter(setupAction =>{setupAction.UseCSRedis(newFilterCSRedisOptions{Name="Redis1",RedisKey="CSRedis1",ConnectionStrings=new[]{"localhost"}.ToList()});});varprovider=services.BuildServiceProvider();varbf=provider.GetService<IBloomFilter>();bf.Add("Value");Console.WriteLine(bf.Contains("Value"));

FreeRedis

varservices=newServiceCollection();services.AddBloomFilter(setupAction =>{setupAction.UseFreeRedis(newFilterFreeRedisOptions{Name="Redis1",RedisKey="FreeRedis1",ConnectionStrings=new[]{"localhost"}.ToList()});});varprovider=services.BuildServiceProvider();varbf=provider.GetService<IBloomFilter>();bf.Add("Value");Console.WriteLine(bf.Contains("Value"));

EasyCaching

varservices=newServiceCollection();services.AddEasyCaching(setupAction =>{setupAction.UseCSRedis(configure =>{configure.DBConfig=newCSRedisDBOptions{ConnectionStrings=newSystem.Collections.Generic.List<string>{"127.0.0.1,defaultDatabase=0,poolsize=10"}};},"BloomFilter1");setupAction.UseCSRedis(configure =>{configure.DBConfig=newCSRedisDBOptions{ConnectionStrings=newSystem.Collections.Generic.List<string>{"127.0.0.1,defaultDatabase=1,poolsize=10"}};},"BloomFilter2");});services.AddBloomFilter(setupAction =>{setupAction.UseEasyCachingRedis(newFilterEasyCachingRedisOptions{Name="BF1",RedisKey="EasyCaching1",ProviderName="BloomFilter1"});//BloomFilter2setupAction.UseEasyCachingRedis(newFilterEasyCachingRedisOptions{Name="BF2",RedisKey="EasyCaching1"});});varprovider=services.BuildServiceProvider();varfactory=provider.GetService<IBloomFilterFactory>();varbf=provider.GetService<IBloomFilter>();varbf1=factory.Get("BF1");bf.Add("Value");Console.WriteLine(bf.Contains("Value"));bf1.Add("Value");Console.WriteLine(bf1.Contains("Value"));

Benchmark

BenchmarkDotNet=v0.13.5, OS=Windows 11 (10.0.22621.1778/22H2/2022Update/SunValley2)
AMD Ryzen 7 5800X, 1 CPU, 16 logical and 8 physical cores
.NET SDK=7.0.304
[Host] : .NET 7.0.7 (7.0.723.27404), X64 RyuJIT AVX2
DefaultJob : .NET 7.0.7 (7.0.723.27404), X64 RyuJIT AVX2
MethodDataSizeMethodMeanErrorStdDevMedianMinMaxRankGen0Allocated
Add64LCGWithFNV191.27 ns1.792 ns2.134 ns90.38 ns88.40 ns96.90 ns110.004880 B
Add64LCGWithFNV1a90.88 ns0.638 ns0.498 ns90.91 ns89.75 ns91.60 ns110.004880 B
Add64LCGModifiedFNV191.80 ns1.009 ns0.895 ns91.50 ns90.96 ns93.72 ns110.004880 B
Add64RNGWithFNV1445.32 ns8.463 ns9.747 ns443.96 ns433.96 ns471.98 ns180.0229384 B
Add64RNGWithFNV1a494.80 ns7.796 ns6.911 ns494.26 ns487.26 ns508.36 ns210.0229384 B
Add64RNGModifiedFNV1461.74 ns4.737 ns4.199 ns461.52 ns455.88 ns471.08 ns190.0229384 B
Add64CRC32145.63 ns1.528 ns1.429 ns145.35 ns143.68 ns148.68 ns130.0196328 B
Add64CRC6438.83 ns0.399 ns0.333 ns38.93 ns38.32 ns39.38 ns30.004880 B
Add64Adler32150.07 ns0.664 ns0.589 ns150.24 ns148.82 ns150.83 ns140.0200336 B
Add64Murmur370.98 ns1.108 ns1.036 ns70.43 ns69.88 ns73.06 ns60.004880 B
Add64Murmur32BitsX8671.19 ns0.727 ns0.607 ns71.02 ns70.33 ns72.40 ns60.004880 B
Add64Murmur128BitsX6480.15 ns0.783 ns0.653 ns80.26 ns78.99 ns81.30 ns80.0072120 B
Add64Murmur128BitsX8682.73 ns1.211 ns1.011 ns82.80 ns81.47 ns84.73 ns90.0072120 B
Add64SHA11,045.67 ns6.411 ns5.997 ns1,044.74 ns1,037.64 ns1,057.40 ns250.0267464 B
Add64SHA256922.30 ns4.478 ns3.739 ns920.17 ns917.46 ns929.13 ns240.0296496 B
Add64SHA3841,173.67 ns5.050 ns3.942 ns1,172.66 ns1,168.47 ns1,181.55 ns260.0267456 B
Add64SHA5121,368.20 ns10.967 ns9.722 ns1,366.36 ns1,354.64 ns1,388.86 ns280.0286504 B
Add64XXHash3273.15 ns0.526 ns0.466 ns73.22 ns72.43 ns74.02 ns70.004880 B
Add64XXHash6450.62 ns0.756 ns0.670 ns50.36 ns49.88 ns51.99 ns40.004880 B
Add64XXHash333.14 ns0.295 ns0.276 ns33.09 ns32.75 ns33.78 ns10.004880 B
Add64XXHash12836.01 ns0.673 ns0.749 ns36.00 ns34.62 ns37.40 ns20.004880 B
Add1024LCGWithFNV1899.25 ns1.286 ns1.140 ns899.00 ns897.38 ns901.74 ns230.004880 B
Add1024LCGWithFNV1a900.59 ns3.196 ns2.990 ns899.46 ns897.27 ns906.06 ns230.004880 B
Add1024LCGModifiedFNV1898.96 ns1.230 ns1.090 ns898.95 ns896.35 ns900.95 ns230.004880 B
Add1024RNGWithFNV11,258.57 ns2.607 ns2.311 ns1,257.83 ns1,255.55 ns1,263.52 ns270.0229384 B
Add1024RNGWithFNV1a1,262.25 ns9.823 ns8.203 ns1,259.77 ns1,255.89 ns1,279.38 ns270.0229384 B
Add1024RNGModifiedFNV11,273.95 ns7.871 ns6.572 ns1,273.07 ns1,263.13 ns1,286.95 ns270.0229384 B
Add1024CRC32549.69 ns5.392 ns4.780 ns547.87 ns545.01 ns560.14 ns220.0191328 B
Add1024CRC6488.11 ns0.844 ns0.790 ns87.76 ns87.25 ns89.80 ns100.004880 B
Add1024Adler32336.74 ns6.487 ns5.417 ns339.17 ns327.21 ns345.29 ns160.0200336 B
Add1024Murmur3478.67 ns2.061 ns1.928 ns478.31 ns476.10 ns482.93 ns200.004880 B
Add1024Murmur32BitsX86489.07 ns9.783 ns20.203 ns478.96 ns476.13 ns558.53 ns200.004880 B
Add1024Murmur128BitsX64235.87 ns1.664 ns1.557 ns236.20 ns233.30 ns238.38 ns150.0072120 B
Add1024Murmur128BitsX86334.17 ns0.569 ns0.475 ns334.24 ns333.45 ns335.09 ns160.0072120 B
Add1024SHA14,539.64 ns2.843 ns2.374 ns4,539.24 ns4,535.17 ns4,543.87 ns320.0305544 B
Add1024SHA2561,747.90 ns4.390 ns4.106 ns1,748.48 ns1,739.81 ns1,754.14 ns290.0286496 B
Add1024SHA3842,208.86 ns3.754 ns3.328 ns2,208.17 ns2,204.62 ns2,215.67 ns300.0267456 B
Add1024SHA5122,390.80 ns4.451 ns4.164 ns2,390.12 ns2,385.87 ns2,400.78 ns310.0267504 B
Add1024XXHash32421.10 ns0.343 ns0.304 ns421.19 ns420.56 ns421.45 ns170.004880 B
Add1024XXHash64140.22 ns0.233 ns0.218 ns140.26 ns139.91 ns140.63 ns120.004880 B
Add1024XXHash367.50 ns0.134 ns0.112 ns67.48 ns67.32 ns67.75 ns50.004880 B
Add1024XXHash12870.36 ns0.220 ns0.206 ns70.38 ns70.03 ns70.68 ns60.004880 B
Add1048576LCGWithFNV1865,507.14 ns33.403 ns27.893 ns865,515.92 ns865,431.84 ns865,536.13 ns43-80 B
Add1048576LCGWithFNV1a865,569.19 ns37.885 ns33.584 ns865,566.46 ns865,513.28 ns865,628.71 ns43-80 B
Add1048576LCGModifiedFNV1865,544.18 ns49.942 ns44.272 ns865,526.27 ns865,493.55 ns865,652.54 ns43-80 B
Add1048576RNGWithFNV1866,009.20 ns58.792 ns52.118 ns865,989.70 ns865,952.73 ns866,125.00 ns43-384 B
Add1048576RNGWithFNV1a866,010.55 ns65.896 ns61.639 ns866,001.37 ns865,898.73 ns866,147.17 ns43-384 B
Add1048576RNGModifiedFNV1866,024.55 ns52.725 ns46.739 ns866,033.84 ns865,936.52 ns866,088.77 ns43-384 B
Add1048576CRC32405,358.53 ns190.366 ns168.755 ns405,333.28 ns405,092.04 ns405,753.81 ns41-328 B
Add1048576CRC6456,321.74 ns23.680 ns19.774 ns56,315.30 ns56,303.48 ns56,370.02 ns35-80 B
Add1048576Adler32183,236.21 ns307.783 ns287.900 ns183,033.96 ns182,984.23 ns183,816.09 ns38-336 B
Add1048576Murmur3441,874.65 ns120.222 ns112.456 ns441,926.81 ns441,729.10 ns442,070.12 ns42-80 B
Add1048576Murmur32BitsX86441,850.23 ns132.677 ns117.615 ns441,812.06 ns441,735.35 ns442,130.66 ns42-80 B
Add1048576Murmur128BitsX64163,915.44 ns77.542 ns72.533 ns163,879.64 ns163,843.26 ns164,037.11 ns37-120 B
Add1048576Murmur128BitsX86274,620.93 ns185.247 ns173.280 ns274,522.12 ns274,446.83 ns274,957.18 ns39-120 B
Add1048576SHA13,381,425.73 ns706.447 ns626.247 ns3,381,191.80 ns3,380,729.69 ns3,382,828.91 ns47-546 B
Add1048576SHA256874,830.84 ns33.305 ns31.153 ns874,826.37 ns874,775.29 ns874,903.61 ns44-496 B
Add1048576SHA3841,306,967.72 ns831.669 ns777.943 ns1,307,006.64 ns1,305,832.23 ns1,308,288.67 ns45-457 B
Add1048576SHA5122,610,481.14 ns1,360.749 ns1,206.269 ns2,610,458.01 ns2,608,700.00 ns2,612,751.56 ns46-626 B
Add1048576XXHash32382,378.24 ns96.264 ns85.336 ns382,386.87 ns382,255.91 ns382,521.44 ns40-80 B
Add1048576XXHash64100,570.79 ns15.037 ns12.557 ns100,570.25 ns100,551.87 ns100,591.17 ns36-80 B
Add1048576XXHash330,258.92 ns66.019 ns61.754 ns30,218.56 ns30,196.84 ns30,357.71 ns33-80 B
Add1048576XXHash12833,778.68 ns22.719 ns20.139 ns33,779.05 ns33,745.28 ns33,818.32 ns34-80 B

Hash ErrRate

Count:100000 Capacity:958506 Hashes:7 ExpectedElements:100000 ErrorRate:0.01

LCGWithFNV1
Speed:69.1082ms ErrRate:93.942% ErrTotal:93942 Final ErrRate:100.000%
LCGWithFNV1a
Speed:82.353ms ErrRate:93.928% ErrTotal:93928 Final ErrRate:100.000%
LCGModifiedFNV1
Speed:58.9601ms ErrRate:93.926% ErrTotal:93926 Final ErrRate:100.000%
RNGWithFNV1
Speed:218.8725ms ErrRate:0.156% ErrTotal:156 Final ErrRate:1.034%
RNGWithFNV1a
Speed:219.4473ms ErrRate:0.153% ErrTotal:153 Final ErrRate:1.071%
RNGModifiedFNV1
Speed:221.0097ms ErrRate:0.167% ErrTotal:167 Final ErrRate:1.063%
CRC32
Speed:74.8524ms ErrRate:0.183% ErrTotal:183 Final ErrRate:1.018%
CRC64
Speed:22.3531ms ErrRate:0.173% ErrTotal:173 Final ErrRate:0.925%
Adler32
Speed:86.8095ms ErrRate:10.085% ErrTotal:10085 Final ErrRate:23.404%
Murmur3
Speed:42.2731ms ErrRate:0.156% ErrTotal:156 Final ErrRate:0.973%
Murmur32BitsX86
Speed:42.6358ms ErrRate:0.156% ErrTotal:156 Final ErrRate:0.973%
Murmur128BitsX64
Speed:32.2329ms ErrRate:0.160% ErrTotal:160 Final ErrRate:1.021%
Murmur128BitsX86
Speed:36.654ms ErrRate:0.169% ErrTotal:169 Final ErrRate:1.038%
SHA1
Speed:274.6806ms ErrRate:0.175% ErrTotal:175 Final ErrRate:0.952%
SHA256
Speed:209.7873ms ErrRate:0.170% ErrTotal:170 Final ErrRate:0.984%
SHA384
Speed:315.9428ms ErrRate:0.165% ErrTotal:165 Final ErrRate:0.988%
SHA512
Speed:322.2861ms ErrRate:0.171% ErrTotal:171 Final ErrRate:0.998%
XXHash32
Speed:41.2861ms ErrRate:0.163% ErrTotal:163 Final ErrRate:1.035%
XXHash64
Speed:23.5383ms ErrRate:0.149% ErrTotal:149 Final ErrRate:1.054%
XXHash3
Speed:19.8399ms ErrRate:0.157% ErrTotal:157 Final ErrRate:0.966%
XXHash128
Speed:19.7745ms ErrRate:0.155% ErrTotal:155 Final ErrRate:1.027%

About

A bloom filter implementation

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages