HASH(3)

ИМЯ
hash - метод доступа к базе данных ассоциативных массивов

ОБЗОР
#include <sys/types.h>
#include <db.h>

ОПИСАНИЕ
Примечание: В этой странице описаны интерфейсы, предоставляемые glibc до версии 2.1. Начиная с версии 2.2, glibc больше не поддерживает эти интерфейсы. Вероятно, вы ищите API, предоставляемое библиотекой libdb.

Функция dbopen(3) — это библиотечный интерфейс к файлам баз данных. Один из поддерживаемых форматов файлов — hash. Общее описание методов доступа к базам данных находится в dbopen(3). Эта справочная страница содержит только информацию, относящуюся к ассоциативным массивам.

Структура данных ассоциативных массивов (хэш) расширяемая и динамична.

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

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

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

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

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.