HASH(3) | FreeBSD Library Functions Manual | HASH(3) |
名称
hash — hash データベースアクセス方法解説
ルーチン dbopen() は、データベースファイルへのライブラリインタフェースです。サポートされているファイルの形式の 1 つは、 hash ファイルです。データベースアクセス方法の一般的な説明は、 dbopen(3) にあります。このマニュアルページは、 hash 特有の情報についてのみ説明しています。hash データ構造は、拡張可能で、動的なハッシュスキームです。
dbopen() で提供されるアクセス方法特有のデータ構造は、次のように < db.h> インクルードファイルに定義されています。
typedef struct { u_int bsize; u_int ffactor; u_int nelem; u_int cachesize; uint32_t (*hash)(const void *, size_t); int lorder; } HASHINFO;
この構造体の要素 (element) は、次の通りです:
- bsize
- bsize 要素は、 hash テーブルのバケットサイズを定義し、デフォルト値で、4096 バイトです。ディスク常駐テーブルと大きなデータ項目があるテーブルに対して、ページサイズを増加することが望ましいでしょう。
- ffactor
- ffactor 要素は、 hash テーブル内の望ましい密度を示します。それは、 hash テーブルが成長するか、または縮小するかどうかを決定して、任意の 1 つのバケットに蓄積することを可能にされたキーの数の近似です。デフォルト値は、8 です。
- nelem
- nelem 要素は、 hash テーブルの最終サイズの見積りです。設定されないか、または低く設定されるなら、 hash テーブルは、キーが入力されるとともに素直に拡張しますが、少しの性能低下に、気が付くかれるかもしれません。デフォルト値は、1 です。
- cachesize
- メモリキャッシュのバイト単位の推奨される最大サイズ。この値は、 単なる 勧告であり、アクセス方法は、失敗するより、より多くのメモリを割り付けます。
- hash
- hash 要素は、ユーザ定義の hash 関数です。 hash 関数は、すべての指定できるデータで同様にうまく行なわないので、ユーザは、組み込みの hash 関数が特別のデータセットで不完全に行うことが分かります。ユーザ指定の hash 関数は、2 つの引数 (バイト文字列へのポインタと長さ) を取る必要があり、 hash (ハッシュ) 値として使用される 32 ビット量を返します。
- lorder
- 格納されたデータベースのメタデータの整数のバイト順。数値は、整数としての順序を表すべきです。例えば、ビッグエンディアンの順序は、数値 4,321 となるでしょう。 lorder が 0 (順序が指定されない) のなら、現在のホストの順序が使用されます。ファイルが既に存在しているなら、指定された値は、無視され、ツリーが作成されたときに指定された値が使用されます。
ファイルが既に存在し、(そして、 O_TRUNC フラグが指定されてないなら)、 bsize, ffactor, lorder と nelem 引数に指定された値は、無視され、ツリーが作成されたときに指定された値が使用されます。
hash 関数が指定されるなら、 hash_open() は、指定された hash 関数がデータベースが作成されたものと同じかどうかを確認し、そうでなければ、失敗します。
より古い dbm と ndbm ルーチンへの後方互換性のインタフェースが、提供されていますが、これらのインタフェースは、前のファイル形式と互換性がありません。
エラー
hash アクセス方法ルーチンは、失敗し、ライブラリルーチン dbopen(3) で明記されたエラーのいずれかの値が errno に設定されます。関連項目
btree(3), dbopen(3), mpool(3), recno(3) Per-Ake Larson, Dynamic Hash Tables, Communications of the ACM, April 1988. Margo Seltzer, A New Hash Package for UNIX, USENIX Proceedings, Winter 1991.バグ
ビッグエンディアンとリトルエンディアンのバイト順のみ、サポートされています。August 18, 1994 | FreeBSD |