Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 69d7124

Browse files
#36 Add ability to change the number of hash functions
1 parent 8b6b802 commit 69d7124

File tree

2 files changed

+50
-15
lines changed

2 files changed

+50
-15
lines changed
Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections;
3+
using System.Collections.Generic;
34

45
namespace Advanced.Algorithms.DataStructures
56
{
@@ -10,12 +11,20 @@ public class BloomFilter<T>
1011
{
1112
private readonly BitArray filter;
1213

14+
private readonly int numberOfHashFunctions;
15+
1316
/// <summary>
1417
/// Higher the size lower the collision and
1518
/// failure probablity.
1619
/// </summary>
17-
public BloomFilter(int size)
20+
public BloomFilter(int size,intnumberOfHashFunctions=2)
1821
{
22+
if (size <= numberOfHashFunctions)
23+
{
24+
throw new ArgumentException("size cannot be less than or equal to numberOfHashFunctions.");
25+
}
26+
27+
this.numberOfHashFunctions = numberOfHashFunctions;
1928
filter = new BitArray(size);
2029
}
2130

@@ -24,13 +33,9 @@ public BloomFilter(int size)
2433
/// </summary>
2534
public void AddKey(T key)
2635
{
27-
var hashCode = key.GetHashCode();
28-
29-
//set 8 consecutive bits (a byte)
30-
for (var i = 0; i < 8; i++)
36+
foreach (var hash in getHashes(key))
3137
{
32-
var index = Math.Abs(hashCode + i) % filter.Length;
33-
filter[index] = true;
38+
filter[hash % filter.Length] = true;
3439
}
3540
}
3641

@@ -39,21 +44,24 @@ public void AddKey(T key)
3944
/// </summary>
4045
public bool KeyExists(T key)
4146
{
42-
var hashCode = key.GetHashCode();
43-
44-
45-
//set 8 consecutive bits (a byte)
46-
for (var i = 0; i < 8; i++)
47+
foreach (var hash in getHashes(key))
4748
{
48-
var index = Math.Abs(hashCode + i) % filter.Length;
49-
50-
if (filter[index] == false)
49+
if (filter[hash % filter.Length] == false)
5150
{
5251
return false;
5352
}
5453
}
5554

5655
return true;
5756
}
57+
58+
private IEnumerable<int> getHashes(T key)
59+
{
60+
for (var i = 1; i <= numberOfHashFunctions; i++)
61+
{
62+
var obj = new { Key = key, InitialValue = i };
63+
yield return Math.Abs(obj.GetHashCode());
64+
}
65+
}
5866
}
5967
}

‎tests/Advanced.Algorithms.Tests/DataStructures/Set/BloomFilter_Tests.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,32 @@ public void BloomFilter_Smoke_Test()
1818
Assert.IsTrue(filter.KeyExists("cat"));
1919
Assert.IsFalse(filter.KeyExists("bat"));
2020
}
21+
22+
[TestMethod]
23+
public void BloomFilter_Accuracy_Test()
24+
{
25+
var bloomFilter = new BloomFilter<string>(10);
26+
27+
bloomFilter.AddKey("foo");
28+
bloomFilter.AddKey("bar");
29+
bloomFilter.AddKey("apple");
30+
bloomFilter.AddKey("orange");
31+
bloomFilter.AddKey("banana");
32+
33+
Assert.IsTrue(bloomFilter.KeyExists("bar"));
34+
Assert.IsFalse(bloomFilter.KeyExists("ba111r"));
35+
36+
Assert.IsTrue(bloomFilter.KeyExists("banana"));
37+
Assert.IsFalse(bloomFilter.KeyExists("dfs11j"));
38+
39+
Assert.IsTrue(bloomFilter.KeyExists("foo"));
40+
Assert.IsFalse(bloomFilter.KeyExists("1foo"));
41+
42+
Assert.IsTrue(bloomFilter.KeyExists("apple"));
43+
Assert.IsFalse(bloomFilter.KeyExists("applefoo"));
44+
45+
Assert.IsTrue(bloomFilter.KeyExists("orange"));
46+
Assert.IsFalse(bloomFilter.KeyExists("orangew"));
47+
}
2148
}
2249
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /