A hashing shard strategy. The same path will always be sent to the same shard.
Inheritance: IShardingStrategy
 public void Given_the_same_path_twice_it_should_return_the_same_id()
 {
     var subject = new HashShardingStrategy();
     var result = subject.GetShardId("any old string", 4);
     var result2 = subject.GetShardId("any old string", 4);
     Assert.AreEqual(result, result2);
 }
 public void Given_a_shardCount_of_1_it_should_always_return_0()
 {
     var subject = new HashShardingStrategy();
     var result = subject.GetShardId("any old string", 1);
     var result2 = subject.GetShardId("some other string", 1);
     Assert.AreEqual(0, result);
     Assert.AreEqual(0, result2);
 }
 public void Given_a_path_and_a_shardcount_of_four_it_should_return_a_value_between_0_and_3()
 {
     //Since we don't "know" the implementation of the hash approximate a test by throwing a bunch of random strings at it.
     //Not great but it gives me enough confidence.
     for (var i = 0; i < 10000; i++)
     {
         var subject = new HashShardingStrategy();
         var result = subject.GetShardId(RandomString(), 4);
         Assert.True(4 > result && 0 <= result);
     }
 }
 public void Given_a_null_path_it_should_throw_ArgumentException()
 {
     var subject = new HashShardingStrategy();
     Assert.Throws<ArgumentException>(() => subject.GetShardId(null, 1));
 }