【发布时间】:2013-03-08 03:15:49
【问题描述】:
循环散列算法在给定一组静态目标的情况下提供一致性。例如:
- 我有一组初始目标,我们称它们为
A、B和C。 - 我有钥匙,我们就叫它
x - 我有一个循环哈希函数,我们称之为
hash(key, targets) - 当我调用
hash(x, [A,B,C])时,x总是哈希到A
似乎很明显。给定x,我总是得到A,这一事实代表了我在使用循环哈希时所期望的一致性。但是,现在让我们考虑如果我添加一个新的会发生什么
节点D:
- 我的目标集重新平衡以包括
A、B、C和D - 我将密钥
x重新应用到hash(x, [A,B,C,D]) - 因为圈子重新平衡了,我不能保证再得到
A
我是错过了什么,还是只是运气不好?当您开始重新排序节点(例如hash(x, [B,A,D,C]))或在现有节点列表的中间插入新节点(例如hash(x, [A,AA,B,C,D]))时,问题会进一步加剧。我对循环散列的学术方面进行了一些研究,这种类型的“缩放一致性”似乎并不是它的主要关注点之一。也许我只是使用了错误类型的哈希算法?
【问题讨论】:
-
抱歉,我找不到很多关于循环哈希的资料。你的意思是一致性哈希和 DHT?
-
您的回答恰当地解释了我所理解的“循环散列”。但是,我认为我离真正的解决方案还差得远。用“记忆”的概念很容易解决这个问题,即记住过去的键在哪里散列。但是,将内存构建到算法中可能是不可能的。在对密钥进行哈希处理后,算法必须发生变化。添加新目标不应影响过去密钥的散列位置。
-
“因为循环重新平衡,我不能保证再得到 A” 所以你是说对于已经散列的项目,它们不应该被分发到新节点? /“当您开始重新排序节点时,问题会进一步加剧”但是在我在答案中提出的模型中,没有重新排序节点这样的事情,因为节点集是无序的。你能解决这两个问题吗?
-
当然。因此,对于您关于已散列项目的问题,是的,它们永远不应该散列到新节点。换句话说,一旦一个键被散列到一个节点,它应该总是散列到那个节点。对于您的第二个问题,您说得对,顺序不会影响您的算法。但是,在我尝试完成这项工作时,我使用了有序列表,甚至围绕圆圈分布。因此,即使添加了新节点,为了保持弧线,现有节点都必须移动(即“重新平衡”)。希望这会增加更多的清晰度,而不是更少:)
标签: php javascript scalability consistent-hashing