public void test_probability_of_collisions_in_tag_produced_by_taking_3_lowest_bytes_from_hashcode_of_guid()
        {
            var dic = new Dictionary <Int32, Guid>();
            var dup = new List <Int32>();

            const int iterations = 1000000;
            var       duplicates = 0;

            for (int i = 0; i < iterations; i++)
            {
                if (i % 100000 == 0)
                {
                    Console.WriteLine(".");
                }

                var guid = Guid.NewGuid();
                var tag  = ProtobufSerializer.GenerateHierarchyTag(guid);

                try
                {
                    dic.Add(tag, guid);
                }
                catch (Exception ex)
                {
                    var originalGuid = dic[tag];
                    duplicates++;
                    dup.Add(tag);
                }

                Assert.That(tag >= 0, Is.True, "Failed on comparing with 0 - {0}", tag);
                Assert.That(tag <= 16777215, Is.True, "Failed on {0}", tag);
            }
            var percent = (double)duplicates / iterations;

            Console.WriteLine("In {0} iterations, {1} duplicated tags. Percent {2}", iterations, duplicates, percent);

            // testing ability to adjust by one:

            var failes = 0;

            foreach (var tag in dup)
            {
                try
                {
                    dic.Add(tag + 1, Guid.Empty);
                }
                catch (Exception ex)
                {
                    failes++;
                }
            }

            //percent = (double)failes / iterations;
            Console.WriteLine("In {0} duplicated tags, {1} can be easely fixed by +1.", dup.Count, dup.Count - failes);
        }
        public void should_be_in_valid_range()
        {
            for (int i = 0; i < 100000000; i++)
            {
                var guid = Guid.NewGuid();
                var tag  = ProtobufSerializer.GenerateHierarchyTag(guid);

                Assert.That(tag >= 0, Is.True, "Should be greater or equal to 0, but was {0}", tag);
                Assert.That(tag <= 16777215, Is.True, "Should be lower or equal to 16777215, but was {0}", tag);
            }
        }
        public void hierarchy_tag_should_be_calculated_correctly()
        {
            Action <String, Int32> test = (guidText, tag) =>
            {
                var guid          = Guid.Parse(guidText);
                var calculatedTag = ProtobufSerializer.GenerateHierarchyTag(guid);
                Assert.That(calculatedTag, Is.EqualTo(tag));
            };

            test("{66047c12-32c5-4842-8023-70d1658a836e}", 12661822);
            test("{ea1dbd75-bf2b-4ed9-be6a-ce32c6b3e505}", 13175895);
            test("{decde923-ff46-4c20-a6f6-ac7645e5325b}", 7625384);
            test("{5c69c886-76ef-4458-8afb-dc7cc40501a2}", 7959428);
            test("{628f6c9b-99bb-4bda-90e5-7b406ca0271a}", 13359269);
        }