04.openssl編程——哈希表

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
功能:計算本自負穿到哈希表中

轉載于:https://www.cnblogs.com/aixiaoxiaoyu/articles/8298433.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252496.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252496.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252496.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

shell數組中“和@的妙用

#!/bin/bashlist(4k"8k a bit""16k abc""32k gold"64k)for i in "${list[]}"do echo $idone 分別對比一下不帶” 和換成*,之間的區別。轉載于:https://www.cnblogs.com/zjd2626/p/7041341.html

「JupyterLab」 Jupyter Notebook 新生代IDE模式頁面

參考:Overview 安裝: $ pip install jupyterlab 啟動(不是jupyter notebook): $ jupyter lab Jupyterlab中最好用的就是顯示csv數據。CSV數據顯示效果: 安裝插件 jupyterlab是和jupyter notebook隔離的&…

undefined reference to 'pthread_create'

剛在Ubuntu16.04 上用Clion寫一個"單生產者-單消費者"的線程的程序,源程序可以參考下面的網址 https://www.cnblogs.com/haippy/p/3252092.html 在編譯的時候編譯器給的提示是: undefined reference to pthread_create 解決辦法就是在CMake…

windows下安裝vundle

windows下安裝vundle ## 前言 windows下安裝vundle和linux下稍微有些不一樣,雖然官網給出了 安裝說明,但是有些問題的。E117: Unknown function: vundle#begin ## 安裝步驟 參考官方文檔即可vundle ## 問題處理 修改_vimrc配置文件內容,這是正…

深度學習框架不能“包治百病”,開發者如何選出最適合自己的?

隨著深度學習關注度和勢頭上升,深度學習被越來越多的企業和組織的生產實踐結合起來。這時,無論是對于深度學習相關專業的初學者,還是已經在企業和組織中從事工業場景應用和研發的開發者來說,選擇一個適合自己,適合業務…

Linux+CLion+cmake 動態鏈接庫的使用

在作《劍指offer》中的單向鏈表的題目時,需要一些常用到的操作鏈表的函數放在一個文件下,我想把這些函數的聲明都寫在list.h文件中,把這些函數的定義都寫在list.cpp文件中,這樣就可以在測試文件test.cpp中調用list.cpp中定義的函數…

PAT(乙級)1009

1009. 說反話 (20)給定一句英語,要求你編寫程序,將句中所有單詞的順序顛倒輸出。 輸入格式:測試輸入包含一個測試用例,在一行內給出總長度不超過80的字符串。字符串由若干單詞和若干空格組成,其中單詞是由英文字母&…

庫存扣減問題

2019獨角獸企業重金招聘Python工程師標準>>> 并發減庫存 并發扣庫存問題總結 庫存扣減還有這么多方案? | 架構師之路 轉載于:https://my.oschina.net/u/2939155/blog/3004363

HSRPSTPACL

1 HSRP配置 1.1 問題 在企業網絡到外部的連接方案中,要求不高的條件下可以是單出口。一旦該出口線路出現問題,整個企業網絡就不能連接到外網了。為了使得企業網絡到外網連接的高可用性,可以設置兩個以上的出口,然而多個出口對…

java 的 CopyOnWriteArrayList類

初識CopyOnWriteArrayList 第一次見到CopyOnWriteArrayList,是在研究JDBC的時候,每一個數據庫的Driver都是維護在一個CopyOnWriteArrayList中的,為了證明這一點,貼兩段代碼,第一段在com.mysql.jdbc.Driver下&#xff0…

科技的趨勢!AI將進軍了37%的企業

2019獨角獸企業重金招聘Python工程師標準>>> 市場研究機構Gartner調查了全球89個國家的逾3,000名信息長(CIO),顯示有37%的企業已經或打算于近期內部署人工智能(AI),在4年內成長270%。Gartner研究…

CMakeLists.txt編寫規則

在PROJECT_SOURCE_DIR下新建了src, include, lib, bin四個子文件夾。 src文件夾用來存放所有的.cpp文件,include文件夾用來存儲所有的.h文件, lib中存放生成的自己編寫的共享庫, bin中存放所有的可執行文件 用SET來設置.exe可執行文件和共享…

nginx.conf配置詳解

######Nginx配置文件nginx.conf中文詳解######定義Nginx運行的用戶和用戶組 user www www;#nginx進程數,建議設置為等于CPU總核心數。 worker_processes 8;#全局錯誤日志定義類型,[ debug | info | notice | warn | error | crit ] error_log /usr/local…

更新 hadoop eclipse 插件

卸載hadoop 1.1.2插件。并安裝新版hadoop 2.2.0插件。 假設直接刪除eclipse plugin文件夾下的hadoop 1.1.2插件,會導致hadoop 1.1.2插件殘留在eclipse中,在eclipse perspective視圖中有Map/Reduce視圖,可是沒有圖標,新建項目也不會…

【K8S學習筆記】Part1:使用端口轉發訪問集群內的應用

本文介紹如何使用kubectl port-forward命令連接K8S集群中運行的Redis服務。這種連接方式有助于數據庫的調試工作。 注意:本文針對K8S的版本號為v1.9,其他版本可能會有少許不同。 0x00 準備工作 在進行該操作之前,需要滿足以下條件&#xff1a…

Ubuntu 16.04 桌面菜單欄 任務欄 標題欄消失的解決辦法

將home目錄下的.cache刪除掉就可以了 & cd & sudo rm -r ./.cache

瓜子二手車發12月二手車價格:漢蘭達奧德賽CR-V保值率居首

中新網1月22日電 日前,基于海量個人對個人的二手車成交數據,瓜子二手車公布了12月全國及多個核心城市的二手車交易“瓜子價”數據。數據顯示,2018年12月全國瓜子二手車嚴選直賣簽約均價為87934元,環比上漲0.16%,同比上…

概率分布之間的距離度量以及python實現(三)

概率分布之間的距離,顧名思義,度量兩組樣本分布之間的距離 。 1、卡方檢驗 統計學上的χ2統計量,由于它最初是由英國統計學家Karl Pearson在1900年首次提出的,因此也稱之為Pearson χ2,其計算公式為 (i1,2&…

Windows vs Linux:\r\n 與 \r

Linux 下文本文件的換行符為 \nWindows 下文本文件的換行符為 \r\n,占兩個字節: \r:歸位鍵(CR),ascii 碼為 13\n:換行鍵(LF),ascii 碼位 10也即單行無換行文本…

C++求職題

文章大部分內容轉載https://www.cnblogs.com/lanxuezaipiao/p/4127904.html 1.冒泡排序法: 如果有N個數字需要排序,那么需要進行(N-1)趟循環,第i趟循環需要對比的次數為(N-i)。所以可以用雙重循環,外層循環用于控制循環的趟數&a…