Skip to content

MrLederer/ConsistentHash

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

76 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

_Consistent_Hash๐Ÿช

GitHub Workflow Status Azure DevOps coverage Nuget

A high performance, immutable, light-weight, dependency-free, ring consistent hash library.

๐Ÿ’ป Usage

Construction

var nodeToWeight = new Dictionary<string, int>()
{
  { "NodeA", 100 },
  { "NodeB", 150 },
};
var hasher = ConsistentHash.Create(nodeToWeight);

Hashing

var node = hasher.Hash(Guid.NewGuid());
// node = "NodeB"

AddOrSet / AddOrSetRange

// {NodeA: 100, NodeB: 150}
hasher = hasher.AddOrSet(node: "NodeA", weight: 200); 
// {NodeA: 200, NodeB: 150}
hasher = hasher.AddOrSetRange(new Dictionary<string, int>() { { "NodeC", 500 }, {"NodeD", 35 } });
// {NodeA: 200, NodeB: 150, NodeC: 500, NodeD: 35}
hasher = hasher.AddOrSet(node: "NodeC", weight: 0);
// {NodeA: 200, NodeB: 150, NodeD: 35}
hasher = hasher.AddOrSet(node: "NodeD", weight: -100);
// {NodeA: 200, NodeB: 150}

Remove / RemoveRange

// {NodeA: 200, NodeB: 150, NodeC: 500, NodeD: 35}
hasher = hasher.Remove("NodeA");
// {NodeB: 150, NodeC: 500, NodeD: 35}
hasher = hasher.Remove("NonExistingNode");
// {NodeB: 150, NodeC: 500, NodeD: 35}
hasher = hasher.RemoveRange(new[] { "NodeC", "NodeD" });
// {NodeB: 150}

๐ŸŒŸ Features

  • High performance - Internally uses GetHashCode and XxHash for mapping nodes to values, and RadixSort for sorting
  • Deterministic - Given particular node/weight pairs, and hash key, the hash result will be identical.
  • Immutable
  • Handles collisions in a deterministic manner (WIP)
  • Thoroughly tested
  • Zero dependencies
  • Super light weight

โšก๏ธ Performance

๐Ÿ“‰ API runtime and memory

Operation Runtime Memory usage Details
Hash O(log(N)) n/a N = Number of nodes
Construction O(โˆ‘ni=0Ni) O(โˆ‘ni=0Ni) Ni = Weight defined for node i
AddOrSetRange O(โˆ‘ni=0Ni) O(โˆ‘ni=0Ni) Ni = Weight defined for node i
RemoveRange O(โˆ‘ni=0Ni) O(โˆ‘ni=0Ni) Ni = Weight defined for node i
Update O(โˆ‘ni=0Ni) O(โˆ‘ni=0Ni) Ni = Weight defined for node i
Contains O(1) n/a
TryGetWeight O(1) n/a
Equals O(N) n/a N = Number of nodes

NOTE: Any altering call creates a new instance, so costing sum of all weights.

๐Ÿ“Š Distribution Benchmarks (WIP)

๐Ÿ“ƒ License

ConsistentHash๐Ÿช is free and open-source software licensed under the GNU General Public License

About

High performance Ring Consistent Hash implementation

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages