我正在阅读freeradius项目中与哈希表相关的代码,并且知道该算法来自"Split-Ordered Lists: Lock-Free Extensible Hash Tables"。我已阅读了论文,但无法理解为什么哈希表使用反向键来对列表中的节点进行排序。有人可以解释一下吗?
答案 0 :(得分:4)
我认为这是因为对于大小为2 ^ k的指针表,它们使用散列函数的低k位作为查找。假设k = 3然后他们查看散列值mod 8,因此0和8间接在点表中的第0个插槽,1和9间接tab [1],依此类推。这意味着如果插入0和8,它们必须在排序列表中非常接近,因为它们都是通过tab [0]到达的。
现在他们增加了表格大小并开始使用mod 16的哈希值.0和8现在通过tab [0]和tab [8]进行映射,但如果你用大小为8的表插入它们,它们将在隔壁在排序列表中彼此相互关联。所以你需要一个排序列表的顺序,它将0和8放在一起而不是0和1,一种方法是在比较之前进行位反转。
另一种选择是使用哈希值的HIGH阶位而不是低阶 - 实际上将哈希值视为二进制固定点数,其二进制点位于最左侧。对于廉价的hash(x)= x%p哈希函数,这是没有意义的,但是他们已经对哈希函数做出了强有力的假设。然后,当你增加你注意到的散列值的位数时,你正在拆分已经合理顺序的值 - 有点像将对象列表编号为(10)(20)(30)......所以你以后可以在(10)和(20)之间插入(15)。
警告:我在无锁文件中看到了足够的细微之处,我非常警惕与其中的任何一个纠缠在一起 - 如果我必须使用它,我会更乐意让别人写它并让它们模型检查它并详尽地测试它,然后等待一两年让其他人找到错误。