ngx_hash.{c|h}實現了nginx裡面比較重要的一個hash結構,這個在模組配置解析裡常被用到。這個hash結構是唯讀的,僅在初始創建時可以給出保存在其中的key-val對兒,然後就只能進行「增刪改查」操作了。
先來看看hash結構的記憶體佈局:
![nginx 源码学习笔记(十)——基本容器——ngx_hash](http://image.codes51.com/Article/image/20151205/20151205153320_0069.gif)
[cpp] view
plaincopyprint?
-
typedef struct {
//指要初始化的雜湊結構-
//為計算散列值用的函數指針
-
-
ngx_uint_t max_size; //允許的最大bucket數量
- ngx_uint_t bucket_size; //為每個bucket允許佔用的最大空間
-
-
char
- *name; //初始化的散列名稱(盡在錯誤日誌中使用) ngx_pool_t *pool; //用於分配雜湊結構空間的記憶體池
- ngx_pool_t
- } ngx_hash_init_t; 還要看圖片理解。這裡不解析程式碼了,雖然看著繁瑣,但用起來還是相當方便。 一般操作有,創建hash和hash中進行查找。
創建hash:- 1.構造一個ngx_hash_key_t 為成員的數組,包含key, value和使用key計算的一個hash值
2. 建立一個ngx_hash_init_t結構的變量,包含了一個結構的成員,hash_t hash的結構體,也包括一些其他初始設置,如bucket的大小,內存池等
3.調用ngx_hash_init 傳入ngx_hash_init_t 結構,ngx_hash_key_t 的數組,和數組的長度,進行初始化,這樣我們的組要的hash結構
查找的過程很簡單
1.計算key 的hash值
2.使用ngx_hash_find 進行查找,需要同時傳入hash值和key ,返回的就是value的指針
需要注意的是,nginx 的hash 在查找時使用的是分桶後線性查找法,因此當分桶數確定時查找效率同其中的總key-val 對數量成反比
以上就介紹了nginx 原始碼學習筆記(十)——基本容器——ngx_hash,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。