HASH(3)

НАЗВАНИЕ
hash - методы доступа к базе данных ассоциативных массивов

СИНТАКСИС
#include <sys/types.h>
#include <db.h>

ОПИСАНИЕ
Функция dbopen является стандартным методом для работы с базами данных. Одним из поддерживаемых ей форматов являются ассоциативные массивы (hash files). Описания основных методов доступа к базам данных находятся в dbopen(3), а данная страница руководства описывает только особенности ассоциативных массивов.

Структура данных массивов гибка и динамична.

Особая структура данных, методы доступа к которой обеспечивает 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 определяет размер заголовка блока массива, по умолчанию равный 256 байтам. Этот параметр может быть изменен, чтобы увеличить размер для таблиц, расположеных на диске, или таблиц с элементами большого размера.

ffactor
    Ffactor указывает на желаемую плотность таблицы ассоциативного массива. Плотность - это максимальное количество ключей, которые могут находится в одной связке, определяющей, на какую величину увеличивается или уменьшается таблица. Значение по умолчанию - 8.

nelem
    Nelem - это предполагаемый окончательный размер таблицы массива. Если величина не установлена, или установлена слишком маленькой, размер таблицы увеличивается каждый раз, когда добавляется новый ключ. Это может привести к понижению производительности и скорости работы. Значение по умолчанию - 1.

cachesize
    Максимальный размер внутреннего кэша таблицы, в байтах. Эта величина только рекомендация, метод доступа скорее выделит память, чем завершится с ошибкой.

hash
    Hash - это пользовательская функция для ассоциативного массива. Не существует функции, которая подойдет для любых данных, пользователю может показаться, что встроенная функция слишком проста для некоторых типов данных. Определяемая пользователем функция должна иметь два аргумента (указатель на строку байтов и длина этой строки) и возвращает 32-битную величину используемую как значение ассоциации.

lorder
    Порядок байт для целых чисел в метаданных таблицы. Число должно представлять порядок байт в целом числе, например, порядок big endian представляется числом 4321. Если lorder равен 0 (т.е. порядок не определен) используется порядок байт текущей архитектуры. Если файл уже существует, то определенная величина будет игнорирована и использоваться будет порядок байт определенный при создании.

Если файл уже существует (и флаг O_TRUNC не определен), величины определяемые в параметрах bsize, ffactor, lorder и nelem будут игнорированы и их значения будут получены из файла.

Если функция для работы с массивом определена, то hash_open попытается определить, совпадает ли эта функция с той, что использовалась при создании файла, и завершается с ошибкой, если это не так.

Обратно совместимый интерфейс определеный в dbm(3), и ndbm(3) также существует, но он не совместим с предыдущими реализациями по формату файлов.

НАЙДЕННЫЕ ОШИБКИ
Метод доступа hash может завершится с ошибкой и установить переменную errno в любое значение, определенное для библиотечной функции dbopen(3).

СМ. ТАКЖЕ
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.

НАЙДЕННЫЕ ОШИБКИ
Поддерживается только big и little endian порядок байтов.