【问题标题】:store known key/value pairs in c在 c 中存储已知的键/值对
【发布时间】:2013-02-06 14:53:23
【问题描述】:

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

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

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

【问题讨论】:

    标签: c key-value


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      为此,知道 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)。

      【讨论】:

        【解决方案3】:

        我会使用排序数组。

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

        这样的好处是不需要任何外部代码。

        【讨论】:

        • 如果我以正确的顺序定义数组,我必须使用 qsort() 吗?
        【解决方案4】:

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

        像这样:

        struct key_value
        {
           int key;
           char* value;
        };
        
        struct key_value kv;
        
        kv.key = 1;
        kv.value = "foo";
        

        【讨论】:

        • 应该如何访问特定项目?谢谢
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-15
        • 2011-05-17
        • 1970-01-01
        • 2013-01-06
        • 2011-03-08
        • 1970-01-01
        • 2021-06-11
        相关资源
        最近更新 更多