循环哈希算法在给定一组静态目标的情况下提供一致性。例如:随着目标集合的增长,循环散列可以保持一致吗?
- 我有一组初始的目标,让我们称他们为
A
,B
和C
。 - 我有钥匙,让我们把它
x
- 我有一个圆形的哈希函数,我们称之为
hash(key, targets)
- 当我打电话
hash(x, [A,B,C])
,x
总是散列到A
似乎很明显。事实上,我总是得到A
给定x
代表我使用循环散列时所期望的一致性。然而,现在让我们考虑一下,如果我添加一个新的 节点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? – Nayuki 2013-03-08 03:35:14
你的回答恰当地解释了我所理解的“循环散列”。但是,我不认为我更接近真正的解决方案。用“记忆”的概念很容易解决这个问题,即记住过去的密钥散列在哪里。但是,将内存构建到算法中可能是不可能的。该算法必须在密钥被哈希后进行变异。添加新的目标不应该影响过去的密钥被散列的位置。 – 2013-03-08 05:57:02
“因为圆是重新平衡的,所以我不能保证再得到A”所以你说对于已经哈希的项目,它们不应该分配给新的节点? /“开始对节点重新排序时,问题会进一步恶化”但是在答案中提出的模型中,不存在重新排序节点的问题,因为节点集是无序的。你能解决这两个问题吗? – Nayuki 2013-03-08 14:28:14