📄 lhash.pod
字号:
=pod=head1 NAMElh_new, lh_free, lh_insert, lh_delete, lh_retrieve, lh_doall,lh_doall_arg, lh_error - dynamic hash table=head1 SYNOPSIS #include <openssl/lhash.h> LHASH *lh_new(unsigned long (*hash)(/*void *a*/), int (*compare)(/*void *a,void *b*/)); void lh_free(LHASH *table); void *lh_insert(LHASH *table, void *data); void *lh_delete(LHASH *table, void *data); void *lh_retrieve(LHASH *table, void *data); void lh_doall(LHASH *table, void (*func)(/*void *b*/)); void lh_doall_arg(LHASH *table, void (*func)(/*void *a,void *b*/), void *arg); int lh_error(LHASH *table);=head1 DESCRIPTIONThis library implements dynamic hash tables. The hash table entriescan be arbitrary structures. Usually they consist of key and valuefields.lh_new() creates a new B<LHASH> structure. B<hash> takes a pointer tothe structure and returns an unsigned long hash value of its keyfield. The hash value is normally truncated to a power of 2, so makesure that your hash function returns well mixed low orderbits. B<compare> takes two arguments, and returns 0 if their keys areequal, non-zero otherwise.lh_free() frees the B<LHASH> structure B<table>. Allocated hash tableentries will not be freed; consider using lh_doall() to deallocate anyremaining entries in the hash table.lh_insert() inserts the structure pointed to by B<data> into B<table>.If there already is an entry with the same key, the old value isreplaced. Note that lh_insert() stores pointers, the data are notcopied.lh_delete() deletes an entry from B<table>.lh_retrieve() looks up an entry in B<table>. Normally, B<data> isa structure with the key field(s) set; the function will return apointer to a fully populated structure.lh_doall() will, for every entry in the hash table, call B<func> withthe data item as parameters.This function can be quite useful when used as follows: void cleanup(STUFF *a) { STUFF_free(a); } lh_doall(hash,cleanup); lh_free(hash);This can be used to free all the entries. lh_free() then cleans up the'buckets' that point to nothing. When doing this, be careful if youdelete entries from the hash table in B<func>: the table may decreasein size, moving item that you are currently on down lower in the hashtable. This could cause some entries to be skipped. The bestsolution to this problem is to set hash-E<gt>down_load=0 before youstart. This will stop the hash table ever being decreased in size.lh_doall_arg() is the same as lh_doall() except that B<func> willbe called with B<arg> as the second argument.lh_error() can be used to determine if an error occurred in the lastoperation. lh_error() is a macro.=head1 RETURN VALUESlh_new() returns B<NULL> on error, otherwise a pointer to the newB<LHASH> structure.When a hash table entry is replaced, lh_insert() returns the valuebeing replaced. B<NULL> is returned on normal operation and on error.lh_delete() returns the entry being deleted. B<NULL> is returned ifthere is no such value in the hash table.lh_retrieve() returns the hash table entry if it has been found,B<NULL> otherwise.lh_error() returns 1 if an error occurred in the last operation, 0otherwise.lh_free(), lh_doall() and lh_doall_arg() return no values.=head1 BUGSlh_insert() returns B<NULL> both for success and error.=head1 INTERNALSThe following description is based on the SSLeay documentation:The B<lhash> library implements a hash table described in theI<Communications of the ACM> in 1991. What makes this hash tabledifferent is that as the table fills, the hash table is increased (ordecreased) in size via OPENSSL_realloc(). When a 'resize' is done, instead ofall hashes being redistributed over twice as many 'buckets', onebucket is split. So when an 'expand' is done, there is only a minimalcost to redistribute some values. Subsequent inserts will cause moresingle 'bucket' redistributions but there will never be a sudden largecost due to redistributing all the 'buckets'.The state for a particular hash table is kept in the B<LHASH> structure.The decision to increase or decrease the hash table size is madedepending on the 'load' of the hash table. The load is the number ofitems in the hash table divided by the size of the hash table. Thedefault values are as follows. If (hash->up_load E<lt> load) =E<gt>expand. if (hash-E<gt>down_load E<gt> load) =E<gt> contract. TheB<up_load> has a default value of 1 and B<down_load> has a default valueof 2. These numbers can be modified by the application by justplaying with the B<up_load> and B<down_load> variables. The 'load' iskept in a form which is multiplied by 256. Sohash-E<gt>up_load=8*256; will cause a load of 8 to be set.If you are interested in performance the field to watch isnum_comp_calls. The hash library keeps track of the 'hash' value foreach item so when a lookup is done, the 'hashes' are compared, ifthere is a match, then a full compare is done, andhash-E<gt>num_comp_calls is incremented. If num_comp_calls is not equalto num_delete plus num_retrieve it means that your hash function isgenerating hashes that are the same for different values. It isprobably worth changing your hash function if this is the case becauseeven if your hash table has 10 items in a 'bucket', it can be searchedwith 10 B<unsigned long> compares and 10 linked list traverses. Thiswill be much less expensive that 10 calls to you compare function.lh_strhash() is a demo string hashing function: unsigned long lh_strhash(const char *c);Since the B<LHASH> routines would normally be passed structures, thisroutine would not normally be passed to lh_new(), rather it would beused in the function passed to lh_new().=head1 SEE ALSOL<lh_stats(3)|lh_stats(3)>=head1 HISTORYThe B<lhash> library is available in all versions of SSLeay and OpenSSL.lh_error() was added in SSLeay 0.9.1b.This manpage is derived from the SSLeay documentation.=cut
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -