Skip to main content

Ring

Struct Ring 

Source
pub struct Ring<'a, T, H = RandomState> { /* private fields */ }
Expand description

A hashing ring implemented using the Cache Array Routing Protocol.

The Cache Array Routing Protocol calculates the relative weight for each node in the ring to distribute points according to their weights.

§Examples

use hash_rings::carp::{Node, Ring};
use std::collections::hash_map::DefaultHasher;
use std::hash::BuildHasherDefault;

type DefaultBuildHasher = BuildHasherDefault<DefaultHasher>;

let mut ring = Ring::with_hasher(
    DefaultBuildHasher::default(),
    vec![Node::new(&"node-1", 1f64), Node::new(&"node-2", 3f64)],
);

ring.remove_node(&"node-1");

assert_eq!(ring.get_node(&"point-1"), &"node-2");
assert_eq!(ring.len(), 1);

let mut iterator = ring.iter();
assert_eq!(iterator.next(), Some((&"node-2", 3f64)));
assert_eq!(iterator.next(), None);

Implementations§

Source§

impl<'a, T> Ring<'a, T, RandomState>

Source

pub fn new(nodes: Vec<Node<'a, T>>) -> Self
where T: Hash + Ord,

Constructs a new, empty Ring<T>.

§Examples
use hash_rings::carp::Ring;

let mut ring: Ring<&str> = Ring::new(vec![]);
Source§

impl<'a, T, H> Ring<'a, T, H>

Source

pub fn with_hasher(hash_builder: H, nodes: Vec<Node<'a, T>>) -> Self
where T: Hash + Ord, H: BuildHasher + Default,

Constructs a new, empty Ring<T> with a specified hash builder.

§Examples
use hash_rings::carp::Ring;
use std::collections::hash_map::DefaultHasher;
use std::hash::BuildHasherDefault;

type DefaultBuildHasher = BuildHasherDefault<DefaultHasher>;

let mut ring: Ring<&str, _> = Ring::with_hasher(DefaultBuildHasher::default(), vec![]);
Source

pub fn insert_node(&mut self, new_node: Node<'a, T>)
where T: Hash + Ord, H: BuildHasher,

Inserts a node into the ring with a particular weight.

Increasing the weight will increase the number of expected points mapped to the node. For example, a node with a weight of three will receive approximately three times more points than a node with a weight of one.

§Examples
use hash_rings::carp::{Node, Ring};

let mut ring = Ring::new(vec![Node::new(&"node-1", 1f64)]);

ring.insert_node(Node::new(&"node-2", 1f64));
Source

pub fn remove_node(&mut self, id: &T)
where T: Eq,

Removes a node from the ring.

§Examples
use hash_rings::carp::{Node, Ring};

let mut ring = Ring::new(vec![Node::new(&"node-1", 1f64), Node::new(&"node-2", 3f64)]);

ring.remove_node(&"node-2");
Source

pub fn get_node<U>(&self, point: &U) -> &'a T
where T: Ord, U: Hash, H: BuildHasher,

Returns the node associated with a point.

§Panics

Panics if the ring is empty.

§Examples
use hash_rings::carp::{Node, Ring};

let mut ring = Ring::new(vec![Node::new(&"node-1", 1f64)]);

assert_eq!(ring.get_node(&"point-1"), &"node-1");
Source

pub fn len(&self) -> usize

Returns the number of nodes in the ring.

§Examples
use hash_rings::carp::{Node, Ring};

let mut ring = Ring::new(vec![Node::new(&"node-1", 1f64), Node::new(&"node-2", 3f64)]);

assert_eq!(ring.len(), 2);
Source

pub fn is_empty(&self) -> bool

Returns true if the ring is empty.

§Examples
use hash_rings::carp::{Node, Ring};

let ring: Ring<'_, u32, _> = Ring::new(vec![]);

assert!(ring.is_empty());
Source

pub fn iter(&'a self) -> impl Iterator<Item = (&'a T, f64)>

Returns an iterator over the ring. The iterator will yield nodes and their weights in sorted by weight, and then by id. particular order.

§Examples
use hash_rings::carp::{Node, Ring};

let mut ring = Ring::new(vec![Node::new(&"node-1", 1f64), Node::new(&"node-2", 3f64)]);

let mut iterator = ring.iter();
assert_eq!(iterator.next(), Some((&"node-1", 1f64)));
assert_eq!(iterator.next(), Some((&"node-2", 3f64)));
assert_eq!(iterator.next(), None);

Trait Implementations§

Source§

impl<'a, T, H> IntoIterator for &'a Ring<'a, T, H>

Source§

type IntoIter = Box<dyn Iterator<Item = (&'a T, f64)> + 'a>

Which kind of iterator are we turning this into?
Source§

type Item = (&'a T, f64)

The type of the elements being iterated over.
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more

Auto Trait Implementations§

§

impl<'a, T, H> Freeze for Ring<'a, T, H>
where H: Freeze,

§

impl<'a, T, H> RefUnwindSafe for Ring<'a, T, H>

§

impl<'a, T, H> Send for Ring<'a, T, H>
where H: Send, T: Sync,

§

impl<'a, T, H> Sync for Ring<'a, T, H>
where H: Sync, T: Sync,

§

impl<'a, T, H> Unpin for Ring<'a, T, H>
where H: Unpin,

§

impl<'a, T, H> UnsafeUnpin for Ring<'a, T, H>
where H: UnsafeUnpin,

§

impl<'a, T, H> UnwindSafe for Ring<'a, T, H>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.