public void GetBucket_WithSameKey_ReturnsSameBucket() { // ARRANGE var cha = new ConsistentHashingAlgorithm(8, 1024); const long key = 42; // ACT var bucketA = cha.GetBucket(key); var bucketB = cha.GetBucket(key); // ASSERT bucketA.Should().Be(bucketB); }
private static void GetBucket_WithRandomInput_IsApproximatelyEvenlyDistributed(int bucketCount) { // ARRANGE const int iterations = 10000; Dictionary <int, int> counts = Enumerable.Range(0, bucketCount).ToDictionary(i => i, i => 0); var cha = new ConsistentHashingAlgorithm(bucketCount, 1024); var random = new Random(0); var longBuffer = new byte[8]; double expectedCount = iterations / (double)bucketCount; double maximumDifference = 0.15 * expectedCount; // ACT for (int i = 0; i < iterations; i++) { random.NextBytes(longBuffer); long key = BitConverter.ToInt64(longBuffer, 0); int bucket = cha.GetBucket(key); counts[bucket]++; } // ASSERT Console.WriteLine("Bucket count: {0}. Expected count: {1}. Maximum difference: {2}.", bucketCount, expectedCount, maximumDifference); for (int i = 0; i < bucketCount; i++) { Console.WriteLine("Bucket: {0}. Actual count: {1}. Difference: {2}.", i, counts[i], Math.Abs(expectedCount - counts[i])); ((double)counts[i]).Should().BeApproximately(expectedCount, maximumDifference); } }