ANSI C哈希表实现,在一个内存块中包含数据

时间:2010-07-20 07:16:02

标签: c hashtable hashmap key-value

我正在寻找一个哈希表的开源C实现,它将所有数据保存在一个内存块中,因此可以轻松地通过网络发送。 我只能找到为每个添加到它的键值对分配小块内存的内容。

非常感谢您提前做好所有投入。

编辑:它不一定需要是一个哈希表,无论键值对表可能做什么。

4 个答案:

答案 0 :(得分:6)

序列化此类数据结构(以及通过网络发送序列化的次数)与使用此类数据结构(在程序中)的次数相比非常低。因此,大多数实现更侧重于速度而不是“可能更容易序列化”的一面。

如果所有数据都在一个已分配的内存块中,那么对该数据结构的大量操作将会有点贵,因为您必须:

  • 在add-operations上重新分配内存
  • 最喜欢删除操作的压缩/真空(这样你喜欢的那个块很密集,没有洞)

无论如何,大多数网络操作都是缓冲的,只需遍历密钥并发送密钥+值。

答案 1 :(得分:1)

在unix系统上,我可能会使用共享内存缓冲区(请参阅shm_open()),或者如果没有带有MAP_SHARED标志的内存映射文件,请参阅特定于操作系统的差异{{3 }}

如果shm_openmmap都不可用,你仍然可以使用磁盘上的文件(在某种程度上),你必须关心正确的锁定,我发送解锁信号到下一个进程并且可能寻找文件的更新部分,然后该进程再次锁定文件,寻找有趣的部分并像往常一样进行(更新/删除/等)。

在任何情况下,您都可以自由设计哈希表的布局或任何您想要的,例如具有固定宽度的键/搜索对。这样你就可以快速访问哈希表的密钥,如果需要,你可以搜索数据部分,然后复制/删除/修改/等。

理想情况下,此文件应位于ram磁盘上。

答案 2 :(得分:0)

我完全同意akira(+1)。还有一个关于数据位置的评论。一旦表变得更大,或者如果卫星数据足够大,那么大多数情况下都会出现缓存污染,这会降低桌面上的任何操作速度,或者换句话说,您可以依靠级别1/2/3缓存链来服务当您必须访问卫星数据时(例如,用于序列化),在快速错过时,关键数据会立即显示。

答案 3 :(得分:0)

提供哈希表的库倾向于隐藏细节并使事物有效工作(这通常是程序员在使用hashtabe时所需要的),所以通常他们处理内存的方式对最终程序员来说是隐藏的,程序员不应该不依赖于特定的“内存布局”,这可能会在以下版本的库中发生变化。

编写您自己的函数,以便以最方便的方式序列化(以及反序列化)哈希表。如果需要多次,可以保留序列化内容(当然,当哈希表更改时,您需要更新保留在内存中的序列化“版本”)。