|
NAMEohash_init , ohash_delete ,
ohash_lookup_interval ,
ohash_lookup_memory ,
ohash_find , ohash_remove ,
ohash_insert , ohash_first ,
ohash_next , ohash_entries
—
light-weight open hashing
LIBRARYOpenBSD Utilities Library (libopenbsd, -lopenbsd)SYNOPSIS#include <stdint.h>
#include <stddef.h>
#include <ohash.h>
void
void
unsigned int
unsigned int
void *
void *
void *
void *
void *
unsigned int
DESCRIPTIONThese functions have been designed as a fast, extensible alternative to the usual hash table functions. They provide storage and retrieval of records indexed by keys, where a key is a contiguous sequence of bytes at a fixed position in each record. Keys can either be NUL-terminated strings or fixed-size memory areas. All functions take a pointer to an ohash structure as the h function argument. Storage for this structure should be provided by user code.
struct ohash_info { ptrdiff_t key_offset; void *data; /* user data */ void *(*calloc)(size_t, size_t, void *); void (*free)(void *, void *); void *(*alloc)(size_t, void *); }; The offset field holds the position of the key in each record; the calloc and free fields are pointers to calloc(3) and free(3)-like functions, used for managing the table internal storage; the alloc field is only used by the utility function ohash_create_entry(3). Each of these functions are called similarly to their standard counterpart, but with an extra void * parameter corresponding to the content of the field data, which can be used to communicate specific information to the functions.
for (n = ohash_first(h, &i); n != NULL; n = ohash_next(h, &i)) do_something_with(n); i points to an auxiliary unsigned integer used to record the current position in the ohash table. Those functions are safe to use even while entries are added to/removed from the table, but in such a case they don't guarantee that new entries will be returned. As a special case, they can safely be used to free elements in the table.
STORAGE HANDLINGOnlyohash_init (),
ohash_insert (), ohash_remove ()
and ohash_delete () may call the user-supplied memory
functions:
p = (*info->calloc)(n, sizeof_record, info->data); /* copy data from old to p */ (*info->free)(old, info->data); It is the responsibility of the user memory allocation code to verify that those calls did not fail. If memory allocation fails, THREAD SAFETYThe open hashing functions are not thread-safe by design. In particular, in a threaded environment, there is no guarantee that a “slot” will not move between aohash_lookup* () and a
ohash_find (), ohash_insert ()
or ohash_remove () call.
Multi-threaded applications should explicitly protect ohash table access. SEE ALSOhcreate(3), ohash_interval(3)Donald E. Knuth, The Art of Computer Programming, Vol. 3, pp 506-550, 1973. STANDARDSThose functions are completely non-standard and should be avoided in portable programs.HISTORYThose functions were designed and written for OpenBSD make(1) by Marc Espie in 1999.
Visit the GSP FreeBSD Man Page Interface. |