コード例 #1
0
        public void TestAddMulModHash()
        {
            var h = new AddMulModHash(new MersenneTwister(1215125));

            var list = Enumerable.Range(0, 80000).Select(i => h.ComputeHash((uint)i)).ToList();
            var set  = new HashSet <uint>(list);

            Assert.Equal(set.Count(), list.Count());
        }
コード例 #2
0
        public void TestAddMulModHashBucketCollisions()
        {
            var h = new AddMulModHash(new MersenneTwister(1215125));

            var maxCollisions = Enumerable.Range(0, 80000)
                                .Select(i => h.ComputeHash((uint)i) % 1000)
                                .GroupBy(i => i, i => 1)
                                .Max(g => g.Count());

            Assert.True(maxCollisions < 100);
        }
コード例 #3
0
        public void TestMinSketch()
        {
            var  rand  = new MersenneTwister(1095807143);
            uint slots = 5113;
            uint algs  = 5;
            //uint slots = 1279;
            //uint algs = 3;

            var inputs = Enumerable.Range(0, (int)slots).Select(ix => (uint)rand.NextUint32()).Distinct().ToList();

            var uniqueInputs = inputs.Count();


            var medianOvercountExpected        = (double)uniqueInputs / slots;
            var peakOvercountPercentageAllowed = 1.03;
            var actualCount      = 1;
            var allowedOvercount = Math.Max(actualCount,
                                            actualCount * medianOvercountExpected * peakOvercountPercentageAllowed);


            var s = new CountMinSketch <AddMulModHash>(slots, algs, AddMulModHash.DeterministicDefault());

            foreach (var i in inputs)
            {
                s.InterlockedAdd(i, actualCount);
            }

            var errors = new List <KeyValuePair <uint, long> >(100);

            for (uint i = 0; i < uniqueInputs; i++)
            {
                var found = s.Estimate(i);
                if (found > allowedOvercount)
                {
                    errors.Add(new KeyValuePair <uint, long>(i, found));
                }
            }
            Assert.Equal(9, errors.Count());
        }