Expand description
An implementation of Rendezvous (a.k.a, highest random weight) hashing algorithm.
§References
- Rendezvous hashing (Wikipedia)
- [Weighted Distributed Hash Tables]
(https://pdfs.semanticscholar.org/8c55/282dc37d1e3b46b15c2d97f60568ccb9c9cd.pdf)
- This paper describes an efficient method for calculating consistent hash values for heterogeneous nodes.
§Examples
For homogeneous nodes:
use rendezvous_hash::RendezvousNodes;
// Constructs a node (a.k.a., server, site, etc) set.
let mut nodes = RendezvousNodes::default();
nodes.insert("foo");
nodes.insert("bar");
nodes.insert("baz");
nodes.insert("qux");
// Finds candidate nodes for an item (a.k.a., object).
assert_eq!(nodes.calc_candidates(&1).collect::<Vec<_>>(),
[&"bar", &"baz", &"foo", &"qux"]);
assert_eq!(nodes.calc_candidates(&"key").collect::<Vec<_>>(),
[&"qux", &"bar", &"foo", &"baz"]);
// Update the node set.
// (The relative order between existing nodes are preserved)
nodes.remove(&"baz");
assert_eq!(nodes.calc_candidates(&1).collect::<Vec<_>>(),
[&"bar", &"foo", &"qux"]);
assert_eq!(nodes.calc_candidates(&"key").collect::<Vec<_>>(),
[&"qux", &"bar", &"foo"]);
For heterogeneous nodes:
use std::collections::HashMap;
use rendezvous_hash::RendezvousNodes;
use rendezvous_hash::{WeightedNode, Capacity};
let mut nodes = RendezvousNodes::default();
nodes.insert(WeightedNode::new("foo", Capacity::new(70.0).unwrap()));
nodes.insert(WeightedNode::new("bar", Capacity::new(20.0).unwrap()));
nodes.insert(WeightedNode::new("baz", Capacity::new(9.0).unwrap()));
nodes.insert(WeightedNode::new("qux", Capacity::new(1.0).unwrap()));
let mut counts = HashMap::new();
for item in 0..10000 {
let node = nodes.calc_candidates(&item).nth(0).unwrap();
*counts.entry(node.node.to_string()).or_insert(0) += 1;
}
assert_eq!(((counts["foo"] as f64) / 100.0).round(), 70.0);
assert_eq!(((counts["bar"] as f64) / 100.0).round(), 20.0);
assert_eq!(((counts["baz"] as f64) / 100.0).round(), 9.0);
assert_eq!(((counts["qux"] as f64) / 100.0).round(), 1.0);
Modules§
- types
- Miscellaneous types.
Structs§
- Capacity
- The capacity of a weighted node.
- Default
Node Hasher - The default
NodeHasher
implementation. - IdNode
- Identity node.
- KeyValue
Node - Key-Value node.
- Rendezvous
Nodes - A candidate node set of a rendezvous for clients that are requiring the same item.
- Weighted
Node - Weighted node.
Traits§
- Node
- This trait represents a candidate node for rendezvous.
- Node
Hasher - This trait allows calculating the hash value of a node for a specific item.