/// <summary>
 /// Remove the given key
 /// </summary>
 /// <param name="key">The key to remove</param>
 /// <param name="hash">The entity hash</param>
 protected virtual void RemoveKey(TKey key, int hash, bool validate)
 {
     if (validate && ValidateConfiguration)
     {
         IsValidConfiguration(Configuration.IdHash(key), hash);
     }
     _data.Set((int)Configuration.Probe(BlockSize, _hashFunctionCount, hash).First(), false);
     ItemCount--;
 }
Esempio n. 2
0
 public void Test_ConstIterator()
 {
     uint[] bitCounts = { 1, 2, 3, 100, 1000 };
     for (int run = 0; run < bitCounts.Length; ++run)
     {
         uint         bitCount = bitCounts[run];
         FastBitArray fba      = new FastBitArray(bitCount);
         // Fill with a pattern 1111...
         for (uint i = 0; i < bitCount; ++i)
         {
             fba.Set(i, true);
         }
         // Verify
         FastBitArray.ConstIterator ci = new FastBitArray.ConstIterator(fba, 0);
         for (uint i = 0; i < bitCount; ++i, ci.Next())
         {
             Assert.AreEqual(true, ci.Value, i.ToString());
         }
         // Fill with a pattern 00000...
         for (uint i = 0; i < bitCount; ++i)
         {
             fba.Set(i, false);
         }
         // Verify
         ci = new FastBitArray.ConstIterator(fba, 0);
         for (uint i = 0; i < bitCount; ++i, ci.Next())
         {
             Assert.AreEqual(false, ci.Value);
         }
         // Fill with a pattern 010101...
         for (uint i = 0; i < bitCount; ++i)
         {
             fba.Set(i, i % 2 == 0);
         }
         // Verify
         ci = new FastBitArray.ConstIterator(fba, 0);
         for (uint i = 0; i < bitCount; ++i, ci.Next())
         {
             Assert.AreEqual(i % 2 == 0, ci.Value);
         }
         // Fill with a pattern 101010...
         for (uint i = 0; i < bitCount; ++i)
         {
             fba.Set(i, i % 2 == 1);
         }
         // Verify
         ci = new FastBitArray.ConstIterator(fba, 0);
         for (uint i = 0; i < bitCount; ++i, ci.Next())
         {
             Assert.AreEqual(i % 2 == 1, ci.Value);
         }
     }
 }
Esempio n. 3
0
 public void Test_Set_Get()
 {
     uint [] bitCounts = { 0, 1, 3, 100, 1000 };
     for (int run = 0; run < bitCounts.Length; ++run)
     {
         uint         bitCount = bitCounts[run];
         FastBitArray fba      = new FastBitArray(bitCount);
         // Fill with a pattern 1111...
         for (uint i = 0; i < bitCount; ++i)
         {
             fba.Set(i, true);
         }
         // Verify
         for (uint i = 0; i < bitCount; ++i)
         {
             Assert.AreEqual(true, fba.Get(i));
         }
         // Fill with a pattern 00000...
         for (uint i = 0; i < bitCount; ++i)
         {
             fba.Set(i, false);
         }
         // Verify
         for (uint i = 0; i < bitCount; ++i)
         {
             Assert.AreEqual(false, fba.Get(i));
         }
         // Fill with a pattern 010101...
         for (uint i = 0; i < bitCount; ++i)
         {
             fba.Set(i, i % 2 == 0);
         }
         // Verify
         for (uint i = 0; i < bitCount; ++i)
         {
             Assert.AreEqual(i % 2 == 0, fba.Get(i));
         }
         // Fill with a pattern 101010...
         for (uint i = 0; i < bitCount; ++i)
         {
             fba.Set(i, i % 2 == 1);
         }
         // Verify
         for (uint i = 0; i < bitCount; ++i)
         {
             Assert.AreEqual(i % 2 == 1, fba.Get(i));
         }
     }
 }
Esempio n. 4
0
        /// <summary>
        /// Convert the slots to a bit array that only includes the specificied number of bits per slot.
        /// </summary>
        /// <param name="slots">The hashed values.</param>
        /// <param name="bitSize">The bit size to be used per slot.</param>
        /// <returns></returns>
        internal static FastBitArray ConvertToBitArray(this int[] slots, byte bitSize)
        {
            if (slots == null || bitSize <= 0)
            {
                return(null);
            }
            var hashValues = new FastBitArray((int)(bitSize * slots.LongLength));
            var allDefault = true;
            var idx        = 0;

            for (var i = 0; i < slots.LongLength; i++)
            {
                allDefault = allDefault && slots[i] == int.MaxValue;
                var byteValue    = BitConverter.GetBytes(slots[i]);
                var byteValueIdx = 0;
                for (var b = 0; b < bitSize; b++)
                {
                    hashValues.Set(idx + b, (byteValue[byteValueIdx] & (1 << (b % 8))) != 0);
                    if (b > 0 && b % 8 == 0)
                    {
                        byteValueIdx = (byteValueIdx + 1) % byteValue.Length;
                    }
                }
                idx += bitSize;
            }
            if (allDefault)
            {
                return(null);
            }
            return(hashValues);
        }
Esempio n. 5
0
        public void Benchmark_Read_ConstIterator()
        {
            uint         BIT_COUNT = 100000000;
            int          REP_COUNT = 10;
            FastBitArray ba        = new FastBitArray(BIT_COUNT);

            // Fill with a pattern 0101...
            for (uint i = 0; i < BIT_COUNT; ++i)
            {
                ba.Set(i, (i % 2) == 0);
            }

            bool checksum = false;

            var startTime = DateTime.Now;

            for (int r = 0; r < REP_COUNT; ++r)
            {
                FastBitArray.ConstIterator ci = new FastBitArray.ConstIterator(ba, 0);
                for (uint i = 0; i < BIT_COUNT; ++i, ci.Next())
                {
                    checksum ^= ci.Value;
                }
            }
            var    runTime       = (DateTime.Now - startTime).TotalSeconds;
            double totalBitCount = (double)REP_COUNT * BIT_COUNT;

            Console.WriteLine("Reading bits: count: {0:#,#}, time: {1:0.000} s, {2:#,#} b/s, cs: {0}",
                              totalBitCount, runTime, totalBitCount / runTime, checksum);
        }