/// <summary>
        /// Initializes the bloom filter with a manual number of hashes.
        /// </summary>
        /// <param name="bitSize">Size of the bloom filter in bits (m)</param>
        /// <param name="setSize">Size of the set (n)</param>
        /// <param name="numberOfHashes">Number of hashing functions (k)</param>
        /// <param name="hashFuncFactory">Hashing function factory</param>
        public BloomFilter(int bitSize, int setSize, int numberOfHashes, HashFunctionFactory <T> hashFuncFactory)
        {
            BitSize        = bitSize;
            SetSize        = setSize;
            NumberOfHashes = numberOfHashes;

            this.bitArray        = new BitArray(bitSize);
            this.hashFuncFactory = hashFuncFactory;
        }
        /// <summary>
        /// Import from an existing bloom filter
        /// </summary>
        /// <param name="filter">Bytes from the existing bloom filter</param>
        /// <param name="setSize">Size of the set (n)</param>
        /// <param name="numberOfHashes">Number of hashing functions (k)</param>
        /// <param name="hashFuncFactory">Hashing function factory</param>
        public BloomFilter(byte[] filter, int setSize, int numberOfHashes, HashFunctionFactory <T> hashFuncFactory)
        {
            BitSize        = filter.Length * BitsInByte;
            SetSize        = setSize;
            NumberOfHashes = numberOfHashes;

            this.bitArray        = new BitArray(BitSize);
            this.hashFuncFactory = hashFuncFactory;

            for (int ind = 0; ind < filter.Length; ind++)
            {
                for (int bit = 0; bit < BitsInByte; bit++)
                {
                    this.bitArray[ind * BitsInByte + bit] = (filter[ind] & (1 << (BitsInByte - 1 - bit))) != 0;
                }
            }
        }
 /// <summary>
 /// Initializes the bloom filter and sets the optimal number of hashes.
 /// </summary>
 /// <param name="bitSize">Size of the bloom filter in bits (m)</param>
 /// <param name="setSize">Size of the set (n)</param>
 /// <param name="hashFuncFactory">Hashing function factory</param>
 public BloomFilter(int bitSize, int setSize, HashFunctionFactory <T> hashFuncFactory) : this(bitSize, setSize, OptimalNumberOfHashes(bitSize, setSize), hashFuncFactory)
 {
 }