2021SC@SDUSC openssl 哈希表

本文详细介绍了OpenSSL中的哈希表数据结构,包括哈希表的概念、哈希冲突、数据结构定义以及相关函数的使用,如插入、删除、遍历和统计等操作。此外,还讨论了用户如何通过提供自定义的哈希和比较函数来适应不同数据类型的存储需求。
摘要由CSDN通过智能技术生成

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值