04.openssl编程——哈希表
生活随笔
收集整理的這篇文章主要介紹了
04.openssl编程——哈希表
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
4.1??? 哈希表在一般的數(shù)據(jù)結(jié)構(gòu)如線性表和樹中,記錄在結(jié)構(gòu)中的相對位置與記錄的關(guān)鍵字之間不存在確定的關(guān)系,在結(jié)構(gòu)中查找記錄時需要進(jìn)行一系列的關(guān)鍵字比較。這一類查找方法建立在比較的基礎(chǔ)上,查找的效率與比較次數(shù)密切相關(guān)。理想的情況是能直接找到需要的記錄,因此必須在記錄的存儲位置和他的關(guān)鍵字之間建立的對應(yīng)關(guān)系,使每個關(guān)鍵字哈希表存在沖突現(xiàn)象:不同的關(guān)鍵字可能得到同一哈希地址。在建造哈希表時不僅要設(shè)定一個好的哈希函數(shù),而且要設(shè)定一種處理沖突的方法。4.2 哈希表數(shù)據(jù)結(jié)構(gòu)其原代碼crypto/lhash目錄下。openssl中的哈希表數(shù)據(jù)結(jié)構(gòu)在lhash.h中定義如下:struct lhash_node_st {void *data;struct lhash _node_st *next;unsigned long hash;}struct lhash_st {OPENSSL_LH_NODE **b; 指針數(shù)組用于存放所有的數(shù)據(jù),數(shù)組中的每一個值為數(shù)據(jù)鏈表的頭指針OPENSSL_LH_COMPFUNC comp;存放數(shù)據(jù)比較函數(shù)地址OPENSSL_LH_HASHFUNC hash;存放計算哈希值函數(shù)的地址unsigned int num_nodes;為鏈表個數(shù)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 函數(shù)說明a.LHASH *OPENSSL_lh_new(LLHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c)功能:生成哈希表說明:輸入?yún)?shù)h為哈希函數(shù),c為比較函數(shù)。這兩個函數(shù)都是回調(diào)函數(shù)。因為哈希表用于存放任意的數(shù)據(jù)結(jié)構(gòu),哈希表存放、查詢、刪除等操作都需要比較函數(shù)和進(jìn)行哈希運算,而哈希表不知道數(shù)據(jù)如何進(jìn)行比較,也不知道用戶數(shù)據(jù)結(jié)構(gòu)中需要對那些關(guān)鍵項進(jìn)行散列運算。所以,用戶必須提供這兩個回調(diào)函數(shù)。b.void *OPENSSL_LH_delete(LHASH *lh, ocnst void *data)功能:刪除散列表中的一個數(shù)據(jù)說明:data為數(shù)據(jù)結(jié)構(gòu)指針c.void OPENSSL_LH_doall(OPENSSL_LHASH *lh, OPENSSL_LH_DOALL_FUNC func)功能:處理哈希表中的所有數(shù)據(jù)說明:func為外不提供的回調(diào)函數(shù),本函數(shù)遍歷所有存儲哈謝表中的數(shù)據(jù),每個數(shù)據(jù)被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)功能:處理哈希表中所有數(shù)據(jù)說明:此參數(shù)類似于OPENSSL_LH_doall函數(shù),func為外部提供的回調(diào)函數(shù),arg為傳遞給func函數(shù)的參數(shù)。本函數(shù)遍歷所有存儲的哈希表中的數(shù)據(jù),每個數(shù)據(jù)被func處理。f.void *OPENSSL_LH_insert(OPENSSL_LHASH *lh, void *data)功能:往哈希表中添加數(shù)據(jù)說明:data為需要添加數(shù)據(jù)結(jié)構(gòu)的指針地址g.void *OPENSSL_LH_retrieve(OPENSSL_LHASH *lh, const void *data)功能:查詢數(shù)據(jù)說明:從哈希表中查詢數(shù)據(jù),data為數(shù)據(jù)結(jié)構(gòu)地址,次數(shù)據(jù)結(jié)構(gòu)中必須提供關(guān)鍵項(這些關(guān)鍵想對于用戶提供的哈希函數(shù)和比較函數(shù))以供查詢,如果查詢成功,返回數(shù)據(jù)結(jié)構(gòu)的地址,否則返回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功能:將哈希表中每個鏈表下的數(shù)據(jù)狀態(tài)輸出到BIO中。i.void OPENSSL_LH_node_usage_stats_bio(const OPENSSL_LHASH *lh, BIO *out)源文件:lh_stats.c功能:將哈希表的使用狀態(tài)輸出到BIO中j.unsigned long OPENSSL_LH_num_items(const OPENSSL_LHASH *lh)源文件:lhash.c功能:輸出哈希表統(tǒng)計信息到BIO中k.void OPENSSL_LH_stats_bio(const OPENSSL_LHASH *lh, BIO *out)源文件:lh_stats.c功能:輸出哈希表統(tǒng)計信息到BIO中l(wèi).void OPENSSL_LH_stats(const OPENSSL_LHASH *lh,FILE *fp)源文件:lh_stats.c功能:輸出哈希表統(tǒng)計信息到BIO中n.unsigned long lh_strhash(const char *c)源文件:lhash.c功能:計算本自負(fù)穿到哈希表中
轉(zhuǎn)載于:https://www.cnblogs.com/aixiaoxiaoyu/articles/8298433.html
總結(jié)
以上是生活随笔為你收集整理的04.openssl编程——哈希表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从入门到旗舰 什么价位的手机才能畅玩《暗
- 下一篇: 51信用卡管家安全吗?这些方面最需注意!