web-dev-qa-db-ja.com

既知のキーと値のペアをcに格納します

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

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

私の最初の賭けはハッシュマップでした。しかし、cにはネイティブの実装はありません。だから私はライブラリを使わなければならないでしょう。

12
Shylux

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

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

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

7
Urchin

これは、メモリのオーバーヘッドがいくらかある一方で、速度の利点がある代替案です。

基本的に、ハッシュ関数が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)であることが保証されています。

8
SirDarius

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

配列は任意の順序で定義でき、実行時に(1回) qsort() 関数を使用して並べ替えることができます。次に、 bsearch() を使用してバイナリ検索を実行できます。応答コードの総数は少なく、バイナリ検索は非常に高速になります。

これには、このような単純なもののために、外部コードを必要としないという利点があります。

5
unwind

たぶん、K\Vを含む構造体を作成できます。

そのようです:

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

struct key_value kv;

kv.key = 1;
kv.value = "foo";
3
Tony The Lion