【发布时间】:2012-12-19 07:32:08
【问题描述】:
我不是在谈论分布式键/值系统,例如通常与 memcached 一起使用的分布式键/值系统,它使用一致的哈希来使添加/删除节点成为一个相对便宜的过程。
我说的是你的标准内存哈希表,比如 python 的 dict 或 perl 的哈希。
通过降低调整哈希表大小的成本,使用一致哈希的好处似乎也适用于这些标准数据结构。实时系统(和其他对延迟敏感的系统)将受益于/需要针对低成本增长进行优化的哈希表,即使整体吞吐量略有下降。
维基百科提到“增量调整大小”,但基本上是在谈论调整大小的热/冷替换方法;有一篇关于“可扩展散列”的单独文章使用 trie 进行存储桶查找来完成廉价的重新散列。
只是好奇是否有人听说过使用一致哈希来降低增长成本的核心单节点哈希表。还是使用其他方法(如上面列出的两个维基百科位)更好地满足此要求?
或者......我的整个问题是否被误导了?内存分页考虑是否使复杂性不值得?也就是说,一致性哈希的额外间接性让您只重新哈希总键的一小部分,但这可能并不重要,因为您可能必须从每个现有页面中读取,因此内存延迟是您的主要因素,以及是否与内存访问的成本相比,您重新散列部分或全部键并不重要....但另一方面,通过一致的散列,您的所有键重映射都有相同的目标页面,所以会有与您的键重新映射到任何现有页面相比,内存抖动更少。
编辑:添加“数据结构”标签,澄清最后一句说“页面”而不是“桶”。
【问题讨论】:
-
快速浏览一下维基百科的描述,我当然看不出重点。您似乎只保存了重新散列和一些表洗牌,但散列函数无论如何都必须快速,移动条目很便宜(与分布式上下文不同),并且很少发生调整大小(有一个体面的增长策略),额外的间接性会减慢 all 查找。但也许我错过了什么。
-
delnan - 是的,你只节省了重新散列,代价是每次查找时都要访问另一个内存。但是,如果您对延迟敏感,则不一定能承受大量计划外的重新散列。类似于为什么人们不使用垃圾收集语言编写实时系统..
标签: data-structures hashtable consistent-hashing