EN JA
HASH(3)
HASH(3) Linux Programmer's Manual HASH(3)

名前

hash - hash データベースへのアクセスメソッド

書式


#include <sys/types.h>
#include <db.h>

説明

大事な注意: このページは、バージョン 2.1 までの glibc が提供するインターフェースについて説明している。バージョン 2.2 以降の glibc では、もはやこれらのインターフェースは提供されていない。おそらく、このページではなく、 libdb ライブラリが提供する API をお探しなのだろう。
 
ルーチン dbopen(3) はデータベースファイルに対するライブラリインターフェースである。サポートされているファイルフォーマットのひとつに hash ファイルがある。データベースへのアクセスメソッドに関する一般的な記述は dbopen(3) に書かれている。このマニュアルページでは hash 特有の情報についてのみ記述する。

hash データ構造は、拡張可能な動的ハッシュスキームである。

dbopen(3) に渡される hash アクセスメソッドに特有のデータ構造体は、 <db.h> インクルードファイルで以下のように定義されている。


typedef struct {
unsigned int bsize;
unsigned int ffactor;
unsigned int nelem;
unsigned int cachesize;
uint32_t (*hash)(const void *, size_t);
int lorder;
} HASHINFO;

この構造体の要素を以下に示す。

bsize
hash テーブルバケット (table bucket) のサイズを定義する。デフォルトは 256 バイトである。ディスクに置かれるテーブルやデータアイテムが大きいテーブルではページサイズを大きくするほうが良いだろう。
ffactor
ユーザが望む hash テーブル中の密度である。これはそれぞれのバケットに格納できるキーの概数であり、 hash テーブルを拡大・縮小を作用する。デフォルトは 8 である。
nelem
hash テーブルの最終サイズを大まかに見積もった値である。この値がセットされていなかったり、あまりに低くセットされていると、 hash テーブルはキーが入ってくるに応じて拡張される。しかし少しパフォーマンスが (おそらく気付く程度に) 落ちる。デフォルト値は 1 である。
cachesize
メモリキャッシュの最大値 (バイト単位) の参考値。この値は あくまで参考であり、アクセスメソッドはこの値を越えたメモリの割り当てに成功することもある。
hash
はユーザー定義の hash 関数である。全てのデータに対してうまく作用する hash 関数と言うのはないから、特定のデータセットに対しては組み込みの hash 関数ではパフォーマンスが低いこともあるかもしれない。ユーザー定義の hash 関数は二つの引数をとらなくてはならない (バイト文字列へのポインタと、長さ)。そして hash 値として使われる 32ビットの値を返さなくてはならない。
lorder
データベースに格納されているメタデータの整数値のバイトオーダー。この数字は、順序を整数で表したものである。例えばビッグエンディアンなら、この数値は 4,321 となる。 lorder が 0 (指定されていない)場合、現在のホストで使われている並び順が使われる。ファイルが既に存在する場合、指定した値は無視されツリーが作られた時に指定されていた値が使われる。

ファイルが既に存在している (または O_TRUNC フラグが指定されていない) と、 bsize, ffactor, lorder, nelem に指定された値は無視され、ハッシュが作られた時に使った値が使われる。

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.

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2012-04-23 4.4 Berkeley Distribution