Algorithm 是否存在支持密钥零重映射的一致哈希算法?

Algorithm 是否存在支持密钥零重映射的一致哈希算法?,algorithm,hash,cluster-computing,consistent-hashing,Algorithm,Hash,Cluster Computing,Consistent Hashing,我了解经典的一致缓存算法,当添加/删除节点时,一些键必须重新映射到不同的节点。如果我放宽一些要求,是否有一种算法完全不支持重新映射 在我的应用程序中,我希望以增量方式将密钥分配给节点: 一旦将密钥分配给节点,它将永远留在那里 节点已添加但未删除。一个节点在添加后永远不会停止-假设复制/备份机制在工作 密钥不需要在节点之间均匀分布。尽力而为:添加新节点时,为其分配的新关键点比旧节点多 这个场景有算法吗 我可以想象两种类似的解决方法,它们可以满足您的要求,但都附带了一些可能无法接受的条件: 如

我了解经典的一致缓存算法,当添加/删除节点时,一些键必须重新映射到不同的节点。如果我放宽一些要求,是否有一种算法完全不支持重新映射

在我的应用程序中,我希望以增量方式将密钥分配给节点:

  • 一旦将密钥分配给节点,它将永远留在那里

  • 节点已添加但未删除。一个节点在添加后永远不会停止-假设复制/备份机制在工作

  • 密钥不需要在节点之间均匀分布。尽力而为:添加新节点时,为其分配的新关键点比旧节点多

    这个场景有算法吗


  • 我可以想象两种类似的解决方法,它们可以满足您的要求,但都附带了一些可能无法接受的条件:

  • 如果缓存客户端知道首先请求的序列密钥是什么,即如果缓存密钥包含某种单调递增的id或版本号,则可以跟踪集群大小增加时的序列号,并根据当时存在的节点数计算哈希
  • 如果您不介意两阶段查找,您可以保留一个密钥→numnodes查找表,记录缓存密钥时有多少节点,然后使用该表计算哈希代码。还是留一把钥匙→缓存节点查找表
  • (如果两阶段查找正常,但查找表的大小是一个问题,则#2上的一个变体:保留一个哈希(键)→缓存节点查找表,并使该散列尽可能小以保持查找表的小。如果两个键恰好具有相同的散列,则它们最终位于同一个节点上-但如果平衡不严格,则不必担心。)

    这两种技术甚至都不依赖于一致的散列(只是简单的散列代码),但它们都有很大的局限性


    在一般情况下,如果没有将密钥与首次缓存该密钥时的缓存状态相关的信息联系起来,那么不,我认为您所要求的是不可能的

    你的第一个解决方法正是我所想的,但是单调递增的键似乎很有限制性。我认为“2上的变化”很有希望,如果你能容忍两阶段查找,并且第一次查找是一个热点的话。不管你怎么做,你都得想办法把过去的某一部分编码成现在的样子。是的,我会试试的。谢谢你的要求不能以无状态的方式实现。比如说,这种算法需要知道其余节点上的平均负载,以管理何时转到或不转到新节点。