12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- from library.pymemcache.client.murmur3 import murmur3_32
- class RendezvousHash(object):
- """
- Implements the Highest Random Weight (HRW) hashing algorithm most
- commonly referred to as rendezvous hashing.
- Originally developed as part of python-clandestined.
- Copyright (c) 2014 Ernest W. Durbin III
- """
- def __init__(self, nodes=None, seed=0, hash_function=murmur3_32):
- """
- Constructor.
- """
- self.nodes = []
- self.seed = seed
- if nodes is not None:
- self.nodes = nodes
- self.hash_function = lambda x: hash_function(x, seed)
- def add_node(self, node):
- if node not in self.nodes:
- self.nodes.append(node)
- def remove_node(self, node):
- if node in self.nodes:
- self.nodes.remove(node)
- else:
- raise ValueError("No such node %s to remove" % (node))
- def get_node(self, key):
- high_score = -1
- winner = None
- for node in self.nodes:
- score = self.hash_function(
- "%s-%s" % (node, key))
- if score > high_score:
- (high_score, winner) = (score, node)
- elif score == high_score:
- (high_score, winner) = (score, max(str(node), str(winner)))
- return winner
|