我有一个程序,读取文件中的网址,并在每个网址主机上执行gethostbyname()
。这个调用相当耗时。我想缓存它们。
有没有一个非常简单的基于Map的C代码片段,我可以用来做缓存?(我只是不想重新发明轮子)。
它必须具备以下几点:
- 许可证**的开源(考虑BSD或公共域)。
*非常简单理想地小于100LOC
- 许可证**的开源(考虑BSD或公共域)。
- 密钥为
char*
,值为void*
,无需复制。 - 真实的上不需要实现
remove()
,但是需要contains()
或者put()
应该替换该值。
PS:我把它标记为“家庭作业”,因为它可能是。我只是"非常“懒惰,并希望避免所有常见的陷阱,我可能会遇到,而重新实现。
8条答案
按热度按时间pftdvrlh1#
这是一个非常简单和天真的
:
relj7zay2#
Christoper Clark's hashtable implementation非常简单,它有100多行,但不是很多。
克拉克的代码似乎已经作为一个并行化示例进入了Google's Conccurrency Library。
zrfyljdw3#
C++中的
std::map
是一棵红黑树;使用an existing red-black tree implementation in C怎么样?我链接的那个更像是700 LOC,但是它的注解很好,从我粗略地看了一下看起来很正常。你可能会找到其他的;这是谷歌搜索“C红黑树”的第一个结果。如果你对性能不挑剔,你也可以使用一个不平衡的二叉树或者一个最小堆或者类似的东西。使用一个平衡的二叉树,你可以保证O(logn)的查找;对于一个不平衡的树,查找的最坏情况是O(n)(对于节点按顺序插入的病态情况,所以你最终得到一个像链表一样的很长的分支),但是(如果我的记忆是正确的话)平均情况仍然是O(logn)。
kgqe7b3p4#
您可以尝试使用以下实现
clib
bakd9h0s5#
是吗
不是代码片段,而是一个高性能的分布式缓存引擎。
5hcedyr06#
不懒惰,深刻的明智,以避免写这种东西。
这个library怎么样?我自己从来没有用过,但它似乎声称能满足你的要求。
f0ofjuux7#
Dave Hanson的C Interfaces and Implementations包含了一个不错的哈希表,以及许多其他有用的模块。哈希表有150行,但这包括内存管理、高阶Map函数和数组转换。该软件是免费的,值得一买。
kjthegm68#
在此找到一个实现:c文件和h文件,这两个文件与您要求的文件非常接近。W3C许可证