# [−][src]Crate rendezvous_hash

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. DefaultNodeHasher The default `NodeHasher` implementation. IdNode Identity node. KeyValueNode Key-Value node. RendezvousNodes A candidate node set of a rendezvous for clients that are requiring the same item. WeightedNode Weighted node.

## Traits

 Node This trait represents a candidate node for rendezvous. NodeHasher This trait allows calculating the hash value of a node for a specific item.