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()); }
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); }
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()); }