Crate rendezvous_hash

Source
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.
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.