4.1??? 哈希表
在一般的數據結構如線性表和樹中,記錄在結構中的相對位置與記錄的關鍵字之間不存在確定的關系,在結構中查找記錄時需要進行一系列的關鍵字比較。這一類查找方法建立在比較的基礎上,查找的效率與比較次數密切相關。理想的情況是能直接找到需要的記錄,因此必須在記錄的存儲位置和他的關鍵字之間建立的對應關系,使每個關鍵字哈希表存在沖突現象:不同的關鍵字可能得到同一哈希地址。在建造哈希表時不僅要設定一個好的哈希函數,而且要設定一種處理沖突的方法。
4.2 哈希表數據結構
其原代碼crypto/lhash目錄下。
openssl中的哈希表數據結構在lhash.h中定義如下:
struct lhash_node_st {
void *data;
struct lhash _node_st *next;
unsigned long hash;
}
struct lhash_st {
OPENSSL_LH_NODE **b; 指針數組用于存放所有的數據,數組中的每一個值為數據鏈表的頭指針
OPENSSL_LH_COMPFUNC comp;存放數據比較函數地址
OPENSSL_LH_HASHFUNC hash;存放計算哈希值函數的地址
unsigned int num_nodes;為鏈表個數
unsgined int num_alloc_nodes;分配空間的大小
unsigned int p;
unsigned int pmax;
unsigned long up_load;
unsigned long down_load;
unsigned long num_items;
unsigned long num_expand_reallocs;
unsigned long num_expand_reallocs;
unsgined long num_contracts;
unsigned long num_contract_reallocs;
unsigned long num_comp_calls;
unsigned long num_hash_calls;
unsigned long num_insert;
unsgined long num_replace;
unsigned long num_delete;
unsigned long num_retrieve;
unsigned long num_retrieve_miss;
unsigned long num_hash_comps;
int error;
}
4.3 函數說明
a
.LHASH *OPENSSL_lh_new(LLHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c)
功能:生成哈希表
說明:輸入參數h為哈希函數,c為比較函數。這兩個函數都是回調函數。因為哈希表用于存放任意的數據結構,哈希表存放、查詢、刪除等操作都需要比較函數和進行哈希運算,而哈希表不知道數據如何進行比較,也不知道用戶數據結構中需要對那些關鍵項進行散列運算。所以,用戶必須提供這兩個回調函數。
b.void *OPENSSL_LH_delete(LHASH *lh, ocnst void *data)
功能:刪除散列表中的一個數據
說明:data為數據結構指針
c.void OPENSSL_LH_doall(OPENSSL_LHASH *lh, OPENSSL_LH_DOALL_FUNC func)
功能:處理哈希表中的所有數據
說明:func為外不提供的回調函數,本函數遍歷所有存儲哈謝表中的數據,每個數據被func處理
d.void OPENSSL_LH_free(OPENSSL_LHASH *lh)
功能:釋放哈希表
e.void OPENSSL_LH_doall_arg(OPENSSL_LHASH *lh, OPENSSL_LH_DOALL_FUNCARG func, void *arg)
功能:處理哈希表中所有數據
說明:此參數類似于OPENSSL_LH_doall函數,func為外部提供的回調函數,arg為傳遞給func函數的參數。本函數遍歷所有存儲的哈希表中的數據,每個數據被func處理。
f.void *OPENSSL_LH_insert(OPENSSL_LHASH *lh, void *data)
功能:往哈希表中添加數據
說明:data為需要添加數據結構的指針地址
g.void *OPENSSL_LH_retrieve(OPENSSL_LHASH *lh, const void *data)
功能:查詢數據
說明:從哈希表中查詢數據,data為數據結構地址,次數據結構中必須提供關鍵項(這些關鍵想對于用戶提供的哈希函數和比較函數)以供查詢,如果查詢成功,返回數據結構的地址,否則返回NULL.
SSL_SESSION *ret = NULL, data;
data.ssl_version=s->version;
data.session_id_length = len;
memcpy(data.session_id, session_id, len);
ret = (SSL_SESSION*)lh_retriev(s->ctx->sessions,&data);
h.void OPENSSL_LH_node_usage_stats_bio(const OPENSSL_LHASH *lh, BIO *out)
源文件:lh_stats.c
功能:將哈希表中每個鏈表下的數據狀態輸出到BIO中。
i.void OPENSSL_LH_node_usage_stats_bio(const OPENSSL_LHASH *lh, BIO *out)
源文件:lh_stats.c
功能:將哈希表的使用狀態輸出到BIO中
j.unsigned long OPENSSL_LH_num_items(const OPENSSL_LHASH *lh)
源文件:lhash.c
功能:輸出哈希表統計信息到BIO中
k.void OPENSSL_LH_stats_bio(const OPENSSL_LHASH *lh, BIO *out)
源文件:lh_stats.c
功能:輸出哈希表統計信息到BIO中
l.void OPENSSL_LH_stats(const OPENSSL_LHASH *lh,FILE *fp)
源文件:lh_stats.c
功能:輸出哈希表統計信息到BIO中
n.unsigned long lh_strhash(const char *c)
源文件:lhash.c
功能:計算本自負穿到哈希表中