11using System ;
22using System . Collections ;
3+ using System . Collections . Generic ;
34
45namespace 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 , int numberOfHashFunctions = 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}
0 commit comments