16

私は現在cを学んでいます。演習として Web サーバーを作成しています。
ここで、ステータス コードと理由フレーズを保存する必要があります。

これらのキーと値のペアを保存する最良の方法は何ですか?

私の最初の賭けはハッシュマップでした。しかし、c にはネイティブ実装はありません。したがって、ライブラリを使用する必要があります。

4

4 に答える 4

9

他の回答と同様に、文字列の配列をルックアップ テーブルとして使用することもお勧めします。すべてのステータス コードが一意であると仮定すると、文字列の配列は、小さなデータ セットの最も簡単な実装です。

大量のデータを保存し始めると、ハッシュマップが有用になり始めます。ここではルックアップ配列が解決策ですが、C を学んでいるとおっしゃっていたように、実際には動的メモリを使用してネイティブ C でハッシュテーブルを実装できます (C を学ぶ上で重要な概念です)。 C とてもよく。

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

于 2013-02-06T16:41:20.253 に答える
9

これは、メモリのオーバーヘッドがいくらかありますが、速度の利点がある別のアイデアです。

基本的に、ハッシュ関数が ID (コード -> コード) であるハッシュ テーブルの最も単純な形式で、ルックアップ テーブルとも呼ばれます。

これを行うには、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 に答える
5

ソートされた配列を使用します。

配列を任意の順序で定義し、qsort()関数を使用して実行時に (1 回) 並べ替えることができます。次に、を使用してバイナリ検索を実行できます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 に答える