kurukuru-papaのブログ

主に、ソフトウェア開発に関連したメモを書き溜めたいと思います。

ハッシュテーブルを使ってみる

APR(Apache Portable Runtime)のハッシュ機能を使ってみました。ハッシュ機能を利用する場合の手順は次のようになるようです。

  1. apr_pool_create関数を使用して、ハッシュ機能で使用するメモリプールを作成します。
  2. apr_hash_make関数を使用して、ハッシュテーブルを作成します。
  3. apr_hash_set関数を使用して、ハッシュテーブルに要素を追加します。
  4. apr_hash_set,apr_hash_get,apr_hash_first,apr_hash_next,apr_hash_this,apr_hash_count関数などを使用して、各要素にアクセスします。
  5. ハッシュテーブルを使い終わったら、apr_pool_clearまたはapr_pool_destroy関数を使用して、メモリプールを破棄します。

プログラム例

ハッシュテーブルへ、文字列のキーと値のペアを3つ登録し、各要素の取得、変更、削除をするサンプルプログラムを作成してみました。

try_apr_hash.c

#include <stdio.h>
#include "apr_hash.h"

void print_hash(apr_pool_t *pool, apr_hash_t *hash) {
	apr_hash_index_t *hash_index = NULL;
	const void *key = NULL;
	void *val = NULL;
	
	// 要素数を出力する。
	printf("要素数:[%d]\n", apr_hash_count(hash));

	// 内容を出力する。
	hash_index = apr_hash_first(pool, hash);
	while (hash_index) {
		apr_hash_this(hash_index, &key, NULL, &val);
		printf("key=[%s], value=[%s]\n", (char*)key, (char*)val);
		hash_index = apr_hash_next(hash_index);
	}
}

int main(int argc, char **argv) {
	
	apr_status_t status = APR_SUCCESS;
	apr_pool_t *pool = NULL;
	apr_hash_t *hash = NULL;
	char *key1 = "key1";
	char *key2 = "key2";
	char *key3 = "key3";
	char *value1 = "value1";
	char *value2 = "value2";
	char *value3 = "value3";
	char *value4 = "value4";
	
	// APRを初期化する。
	apr_initialize();
	
	// メモリプールを作成する。
	status = apr_pool_create(&pool, NULL);
	if (status == APR_SUCCESS) {
		
		// ハッシュを作成する。
		hash = apr_hash_make(pool);
		
		// 要素を追加する。
		apr_hash_set(hash, key1, APR_HASH_KEY_STRING, value1);
		apr_hash_set(hash, key2, APR_HASH_KEY_STRING, value2);
		apr_hash_set(hash, key3, APR_HASH_KEY_STRING, value3);
		
		printf("キー[%s]の値=[%s]\n", key1, (char*)apr_hash_get(hash, key1, APR_HASH_KEY_STRING));
		
		// ハッシュの内容を出力する。
		print_hash(pool, hash);
		
		// 要素を変更する。
		apr_hash_set(hash, key2, APR_HASH_KEY_STRING, value4);
		
		// ハッシュの内容を出力する。
		print_hash(pool, hash);
		
		// 要素を削除する。
		apr_hash_set(hash, key2, APR_HASH_KEY_STRING, NULL);
		
		// ハッシュの内容を出力する。
		print_hash(pool, hash);
	}
	else {
		printf("メモリプールを作成できませんでした。\n");
	}
	
	// APRを終了する。
	apr_terminate();
	
	return 0;
}

実行結果

$ ./try_apr_hash.exe
キー[key1]の値=[value1]
要素数:[3]
key=[key1], value=[value1]
key=[key2], value=[value2]
key=[key3], value=[value3]
要素数:[3]
key=[key1], value=[value1]
key=[key2], value=[value4]
key=[key3], value=[value3]
要素数:[2]
key=[key1], value=[value1]
key=[key3], value=[value3]

補足

apr_hash_set関数について
引数にキーと値のポインタを渡します。ハッシュテーブルの各要素は、ポインタで参照される領域をそのまま使用するようです。そのため、呼び出し側で用意したキーと値の領域は、ハッシュテーブルを使い終わるまで、保持しておく必要があるようです。

参考サイト

Apache Portable Runtime: Hash Tables
http://apr.apache.org/docs/apr/1.2/group__apr__hash.html

動作環境

OS : Windows XP, Cygwin
APR Version : 1.2.12