为什么 DJ Bernstein CDB(常量数据库)使用 256 个哈希表?

Nic*_*ick 5 cdb

为什么DJB CDB(常量数据库)被设计为使用256个哈希表?

为什么不使用单个更大的 252 * 256 哈希表?

只是为了节省空间还是有其他原因?

gst*_*uss 5

DJB CDB 使用两级哈希表。第一个表在文件开头固定大小 2K。第二组表位于文件末尾,当数据流入 cdb 时在内存中构建。一旦所有数据都流入 cdb,第二组哈希表就会流出到磁盘,然后第一个表(位于文件的开头)将填充第二组中每个表的偏移量。

换句话说,多级哈希表允许流式创建 cdb,但有一个简单的例外:在 cdb 创建结束时写入文件的开头 2K。

访问cdb很快,命中第一个表(文件开头2K)找到第二个表(第二组表中)在cdb文件末尾的偏移量,它提供了数据的位置在国开行。

更多信息可以在https://github.com/gstrauss/mcdb/的注释中找到,它是 DJB 的古老 cdb 的重写。除其他优点外,mcdb 比 cdb 更快,并且消除了 4GB cdb 限制。

  • 这并没有解决为什么有 256 个 - 通过在文件开头放置一个指针可以实现相同的流传输能力。 (3认同)
  • 第一级哈希表的固定大小意味着在文件开头具有固定偏移量的第一级哈希表将始终在内存中页对齐,并且足够小以适合单页内存(通常是4k 是 x86 系统上的最小页面大小)。在搜索较小的表时减少内存页驱逐方面,拥有两级哈希表可以提高内存效率。256 是 2 的幂,并且如果有良好的哈希算法,则使用更快的位移来查找哈希桶,而不是更昂贵的模数指令。 (2认同)