16

我目前正在学习c。我正在编写一个 Web 服务器作为练习。
现在我必须存储状态代码和原因短语。

存储这些键/值对的最佳方式是什么?

我的第一个赌注是哈希图。但是c中没有本机实现。所以我不得不使用图书馆。

4

4 回答 4

9

这是另一种想法,它具有速度优势,同时具有一些内存开销。

基本上,哈希表的最简单形式,其中哈希函数是身份(代码->代码),也称为查找表。

为此,知道 HTTP 状态代码限制为 5xx,您可以假设 599 将是您需要的最高值,因此您将创建一个包含 600 个元素的表。

该表可以这样完成:

const char * status_messages[600];

初始化非常简单:

/* initialize all with NULL's so invalid codes correspond to NULL pointers */
memset(status_messages, (int)NULL, 600 * sizeof(const char *));
/* ... */
status_messages[403] = "Forbidden";
status_messages[404] = "Not found";
/* ... */

查找消息也非常简单:

int  code = 403;
const char * message = status_messages[code];

这个数组将有 2400 字节大(在 64 位平台上为 4800),但访问时间保证为 O(1)。

于 2013-02-06T15:34:43.770 回答
9

与其他答案一样,我也建议仅使用字符串数组作为查找表。如果您假设所有状态代码都是唯一的,那么对于较小的数据集,字符串数组是迄今为止最简单的实现。

一旦您开始存储大量数据,这就是哈希图开始变得有用的时候。查找数组是这里的解决方案,但是正如您所说您正在学习 C,您实际上可以通过使用动态内存在本机 C 中实现哈希表(对于 C 而言,这是一个学习的关键概念。)该网站解释了如何在C 非常好。

http://www.sparknotes.com/cs/searching/hashtables/section3.rhtml

于 2013-02-06T16:41:20.253 回答
5

我会使用排序数组。

您可以按任何顺序定义数组,并在运行时(一次)使用该qsort()函数对其进行排序。然后您可以使用bsearch(). 响应码的总数很少,二分查找会很快。

对于像这样简单的事情,这具有不需要任何外部代码的优点。

于 2013-02-06T14:55:30.627 回答
3

也许您可以创建一个包含 K\V 的结构。

像这样:

struct key_value
{
   int key;
   char* value;
};

struct key_value kv;

kv.key = 1;
kv.value = "foo";
于 2013-02-06T14:55:31.103 回答