名前
hash - hash データベースへのアクセスメソッド
書式
#include <sys/types.h> #include <db.h>
説明
ルーチン dbopen() はデータベースファイルに対するライブラリインターフェースである。 サポートされているファイルフォーマットのひとつに hash ファイルがある。 データベースへのアクセスメソッドに関する一般的な記述は dbopen(3) に書かれている。 このマニュアルページでは hash 特有の情報についてのみ記述する。
hash データ構造は、拡張可能な動的ハッシュスキームである。
dbopen に渡される hash アクセスメソッドに特有のデータ構造体は、 <db.h> インクルードファイルで以下のように定義されている。
typedef struct {
u_int bsize; u_int ffactor; u_int nelem; u_int cachesize; u_int32_t (*hash)(const void *, size_t); int lorder;
} HASHINFO;この構造体の要素を以下に示す。
bsize | bsize は hash テーブルバケット (table bucket) のサイズを定義する。 デフォルトは 256 バイトである。 ディスクに置かれるテーブルやデータアイテムが大きいテーブルでは ページサイズを大きくするほうが良いだろう。 |
ffactor | |
ffactor は、ユーザが望む hash テーブル中の密度である。 これはそれぞれのバケットに格納できるキーの概数であり、 hash テーブルを拡大・縮小を作用する。 デフォルトは 8 である。 | |
nelem | nelem は hash テーブルの最終サイズを大まかに見積もった値である。 この値がセットされていなかったり、あまりに低くセットされていると、 hash テーブルはキーが入ってくるに応じて拡張される。 しかし少しパフォーマンスが (おそらく気付く程度に) 落ちる。 デフォルト値は 1 である。 |
cachesize | |
この値は あくまで 参考であり、アクセスメソッドはこの値を越えたメモリの 割り当てに成功することもある。 | |
hash | hash はユーザー定義の hash 関数である。 全てのデータに対してうまく作用する hash 関数と言うのはないから、 特定のデータセットに対しては組み込みの hash 関数では パフォーマンスが低いこともあるかもしれない。 ユーザー定義の hash 関数は二つの引数をとらなくてはならない (バイト文字 列へのポインタと、長さ)。 そして hash 値として使われる 32ビットの値を返さなくてはならない。 |
lorder | データベースに格納されているメタデータの整数値のバイトオーダー。 この数字は、順序を整数で表したものである。 例えばビッグエンディアンなら、この数値は 4,321 となる。 lorder が 0 (指定されていない)場合、現在のホスト で使われている並び順が使われる。 ファイルが既に存在する場合、指定した値は無視されツリーが作られ た時に指定されていた値が使われる。 |
hash 関数が指定されると、 hash_open はデータベースが作られた時に指定されていた hash 関数と今回指定された hash 関数が同じかどうかを調べ、 同じでない場合には失敗する。
dbm(3), と ndbm(3) に記述されているルーチンへの過去互換を取るためのインターフェイスが 存在する。しかしこれらのインターフェイスは以前のファイルフォー マットとは互換性がない。
エラー
hash アクセスメソッドルーチンは、失敗するとライブラリルーチン dbopen(3) で指定されているエラーに応じた errno をセットする。
バグ
バイトオーダーとしてはビッグエンディアンとリトルエンディアンのみが サポートされている。
関連項目
btree(3), dbopen(3), mpool(3), recno(3)
Dynamic Hash Tables, Per-Ake Larson, Communications of the ACM, April 1988.
A New Hash Package for UNIX, Margo Seltzer, USENIX Proceedings, Winter 1991.