2021SC@SDUSC
4 哈希表
man lhash
4.1 哈希表
在一般的数据结构如线性表和树中,录在结构中的相对位置是与记录的关键字之间不存在确定的关系,
在结构中查找记录时需进行一系列的关键字比较.
这一类查找方法建立在"比较"的基础上, 查找的效率与比较次数密切相关。
理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立确定的对应关系,
使每个关键字和结构中一个唯一的存储位置相对应.
在查找时,只需根据这个对应关系找到给定值.
这种对应关系既是哈希函数,按这个思想建立的表为哈希表。
哈希表存在冲突现象:
不同的关键字可能得到同一哈希地址。
在建造哈希表时不仅要设定一个好的哈希函数,而且要设定一种处理冲突的方法。
4.2 哈希表数据结构
openssl函数使用哈希表来加快查询操作,并能存放任意形式的数据,比如配置文件的读取、内存分配中被分配内存的信息等。其源码在crypto/lhash目录下。
openssl中的哈希表数据结构在lhash.h中定义如下:
typedef struct lhash_node_st {
void *data;
struct lhash_node_st *next;
#ifndef OPENSSL_NO_HASH_COMP
unsigned long hash;
#endif
} LHASH_NODE;
本结构是一个单链表。
其中, data用于存放数据地址,
next为下一个数据地址,
hash为数据哈希计算值。
typedef struct lhash_st {
LHASH_NODE **b;
LHASH_COMP_FN_TYPE comp;
LHASH_HASH_FN_TYPE hash;
unsigned int num_nodes;
unsigned int num_alloc_nodes;
unsigned int p;
unsigned int pmax;
unsigned long up_load; /* load times 256 */
unsigned long down_load; /* load times 256 */
unsigned long num_items;
unsigned long num_expands;
unsigned long num_expand_reallocs;
unsigned long num_contracts;
unsigned long num_contract_reallocs;
unsigned long num_hash_calls;
unsigned long num_comp_calls;
unsigned long num_insert;
unsigned long num_replace;
unsigned