HASH(3)

名称
hash - hash データベース アクセス方式

書式
<sys/types.h> <db.h>

解説
dbopen() ルーチンは、データベースファイルへのライブラリインタフェースです。 サポート対象のファイル形式の一つは hash ファイルです。本マニュアルの dbopen(3) にあるデータベースアクセス方式の一般的な解説は に書かれており、 hash 固有の情報だけを説明しています。

hash データ構造は拡張可能な動的ハッシュスキーマです。

dbopen() に与えられるアクセス方式固有のデータ構造体は インクルードファイル <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 表のバケットサイズを定義し、デフォルト値で 256 バイトです。 ディスク常駐テーブルと大型データ項目については、 ページサイズを拡大したほうが望ましいかもしれません。

ffactor
    ffactor は hash 表内の望ましい密度を表示します。 これは一つのバケット内に累積可能なキー数の概算であり、 いつ hash 表の拡大や縮小を行なうべきかを決定します。 デフォルト値は 8 です。

nelem
    nelem は hash 表の最終サイズの推測値です。 未設定あるいは低い値に設定されると、わずかな性能劣化が見られる かもしれませんが、ハッシュ表はキー入力に応じて円滑に拡張されます。 デフォルト値は 1 です。

cachesize
    メモリキャッシュの推奨最大バイトサイズです。 この値は 単なる 提言であり、このアクセス方式は、 失敗するよりはメモリを余計に割り当てるでしょう。

hash
    hash はユーザ定義の hash 関数です。 可能なデータすべてに対して等しく性能の良い hash 関数はないため、 ユーザは、組み込み hash 関数が特定データセットに充分な性能が出ないことに 気がつくことがあるかもしれません。 ユーザ指定 hash 関数は 2 個の引数 (文字列へのポインタと長さ) を取り、 ハッシュ値として使われる 32 ビット量を返します。

lorder
    保存されたデータベースメタデータ 内の整数のバイトオーダです。 数字は整数としての順序を表していなければなりません。 例えば、ビッグエンディアンの順序は 4,321 になります。 lorder が 0 (順序指定なし) の時は現行のホストのオーダが使われます。 ファイルがあらかじめ存在していれば、指定値が無視されて、 ツリーが構築された時に指定された値が使われます。

ファイルがあらかじめ存在し、(かつ O_TRUNC フラグが指定されてないと) 、 bsize, ffactor, lorder, nelem の各パラメータに指定された値は無視され、 ツリーの構築時に指定された値が使われます。

hash 関数が指定されていると、 hash_open() は指定された hash 関数がデータベース作成時と同じものであるかを判別し、 異なっていれば open に失敗します。

旧 dbm および旧 ndbm ルーチンへの下位互換インタフェースが提供されていますが、 これらのインタフェースは従来のファイルフォーマットとは互換ではありません。

エラー
ライブラリルーチン dbopen(3) で指定されている任意のエラーに対し、 hash アクセス方式ルーチンが失敗すると、 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.

バグ
バイトオーダとして、ビッグエンディアンとリトルエンディアンだけが サポートされています。