rendezvous.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. from library.pymemcache.client.murmur3 import murmur3_32
  2. class RendezvousHash(object):
  3. """
  4. Implements the Highest Random Weight (HRW) hashing algorithm most
  5. commonly referred to as rendezvous hashing.
  6. Originally developed as part of python-clandestined.
  7. Copyright (c) 2014 Ernest W. Durbin III
  8. """
  9. def __init__(self, nodes=None, seed=0, hash_function=murmur3_32):
  10. """
  11. Constructor.
  12. """
  13. self.nodes = []
  14. self.seed = seed
  15. if nodes is not None:
  16. self.nodes = nodes
  17. self.hash_function = lambda x: hash_function(x, seed)
  18. def add_node(self, node):
  19. if node not in self.nodes:
  20. self.nodes.append(node)
  21. def remove_node(self, node):
  22. if node in self.nodes:
  23. self.nodes.remove(node)
  24. else:
  25. raise ValueError("No such node %s to remove" % (node))
  26. def get_node(self, key):
  27. high_score = -1
  28. winner = None
  29. for node in self.nodes:
  30. score = self.hash_function(
  31. "%s-%s" % (node, key))
  32. if score > high_score:
  33. (high_score, winner) = (score, node)
  34. elif score == high_score:
  35. (high_score, winner) = (score, max(str(node), str(winner)))
  36. return winner