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

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

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

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

在unix系统上,我可能会使用共享内存缓冲区(请参阅shm_open() ),或者如果没有带有MAP_SHARED标志的内存映射文件,请参阅http://en.wikipedia中特定于操作系统的差异。组织/维基/ MMAP

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

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

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

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

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

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

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

我完全同意akira(+1)。 还有一个关于数据位置的评论。 一旦表变得更大,或者如果卫星数据足够大,那么肯定会出现缓存污染,这会降低桌面上的任何操作速度,或者换句话说,您可以依赖于1/2级缓存链来服务当您必须访问卫星数据时(例如,用于序列化),在提供高速缓存未命中时,及时获得关键数据。

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

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