這期內(nèi)容當(dāng)中的小編將會給大家?guī)碛嘘P(guān)PHP中HashTable的介紹,以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站與策劃設(shè)計(jì),銀海網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:銀海等地區(qū)。銀海做網(wǎng)站價(jià)格咨詢:18980820575
HashTable是什么?
Hashtable 的實(shí)例有兩個(gè)參數(shù)影響其性能:初始容量 和加載因子。容量 是哈希表中桶 的數(shù)量,初始容量 就是哈希表創(chuàng)建時(shí)的容量。注意,哈希表的狀態(tài)為 open:在發(fā)生"哈希沖突"的情況下,單個(gè)桶會存儲多個(gè)條目,這些條目必須按順序搜索。加載因子 是對哈希表在其容量自動增加之前可以達(dá)到多滿的一個(gè)尺度。初始容量和加載因子這兩個(gè)參數(shù)只是對該實(shí)現(xiàn)的提示。關(guān)于何時(shí)以及是否調(diào)用 rehash 方法的具體細(xì)節(jié)則依賴于該實(shí)現(xiàn)。
常見功能
在哈希表中添加一個(gè)key/鍵值對:HashtableObject.Add(key,);
在哈希表中去除某個(gè)key/鍵值對:HashtableObject.Remove(key);
從哈希表中移除所有元素: HashtableObject.Clear();
判斷哈希表是否包含特定鍵key: HashtableObject.Contains(key);
下面控制臺程序?qū)陨纤胁僮?
新版本的HashTable
與老版本的hashtable相比改動還是挺大的
老版本的元素存儲是分散的,Bucket **arBuckets 里面存儲的是指針 指向bucket的地址,新版的的元素存儲是連續(xù)的 Bucket *arData;
老版本bucket中有4個(gè)指針 新版版中的bucket中只有一個(gè)指針,并且只有在hash碰撞的時(shí)候才會用到
少了三個(gè)指針,看下新版本的hashtable 如何做好按照插入順序遍歷和解決hash沖突
看下hashtable的定義
typedef struct _zend_array HashTable; struct _zend_array { zend_refcounted_h gc; // gc 相關(guān) union { // 聯(lián)合體 struct { ZEND_ENDIAN_LOHI_4( zend_uchar flags, zend_uchar nApplyCount, zend_uchar nIteratorsCount, zend_uchar consistency) } v; uint32_t flags; } u; uint32_t nTableMask; // hash表的掩碼 用來確定hsh Bucket *arData; // bucket數(shù)組 uint32_t *arHash; // hashtable 查找 大小為nTableMask 存放指向bucket的指針(疑問在源碼定義中未看到) uint32_t nNumUsed; // 元素個(gè)數(shù) 包含已刪除的元素 uint32_t nNumOfElements; // 有效的元素個(gè)數(shù) uint32_t nTableSize; // hash表的大小 uint32_t nInternalPointer; zend_long nNextFreeElement; dtor_func_t pDestructor; };
bucket的定義
typedef struct _Bucket { zval val; zend_ulong h; //存的hash 值 用來尋找對比key zend_string *key; // 如果key是string 則存放key 如果是數(shù)字 則為空 } Bucket; typedef struct _zval_struct zval; struct _zval_struct { zend_value value; // value 真正的結(jié)構(gòu) union { struct { ZEND_ENDIAN_LOHI_4( zend_uchar type, /* active type */ zend_uchar type_flags, zend_uchar const_flags, zend_uchar reserved) /* call info for EX(This) */ } v; uint32_t type_info; } u1; union { uint32_t next; // 重點(diǎn)關(guān)注這個(gè) 存放hash 沖突下一個(gè)元素的位置 uint32_t cache_slot; /* literal cache slot */ uint32_t lineno; /* line number (for ast nodes) */ uint32_t num_args; /* arguments number for EX(This) */ uint32_t fe_pos; /* foreach position */ uint32_t fe_iter_idx; /* foreach iterator index */ uint32_t access_flags; /* class constant access flags */ uint32_t property_guard; /* single property guard */ uint32_t extra; /* not further specified */ } u2;
結(jié)構(gòu)圖
上述就是小編為大家分享的PHP中的HashTable是,如果您也有類似的疑惑,不妨礙參照上述分析進(jìn)行理解。如果想了解更多相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊。