您好,登錄后才能下訂單哦!
這期內容當中的小編將會給大家帶來有關PHP中HashTable的介紹,以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
HashTable是什么?
Hashtable 的實例有兩個參數影響其性能:初始容量 和加載因子。容量 是哈希表中桶 的數量,初始容量 就是哈希表創建時的容量。注意,哈希表的狀態為 open:在發生"哈希沖突"的情況下,單個桶會存儲多個條目,這些條目必須按順序搜索。加載因子 是對哈希表在其容量自動增加之前可以達到多滿的一個尺度。初始容量和加載因子這兩個參數只是對該實現的提示。關于何時以及是否調用 rehash 方法的具體細節則依賴于該實現。
常見功能
在哈希表中添加一個key/鍵值對:HashtableObject.Add(key,);
在哈希表中去除某個key/鍵值對:HashtableObject.Remove(key);
從哈希表中移除所有元素: HashtableObject.Clear();
判斷哈希表是否包含特定鍵key: HashtableObject.Contains(key);
下面控制臺程序將包含以上所有操作:
新版本的HashTable
與老版本的hashtable相比改動還是挺大的
老版本的元素存儲是分散的,Bucket **arBuckets 里面存儲的是指針 指向bucket的地址,新版的的元素存儲是連續的 Bucket *arData;
老版本bucket中有4個指針 新版版中的bucket中只有一個指針,并且只有在hash碰撞的時候才會用到
少了三個指針,看下新版本的hashtable 如何做好按照插入順序遍歷和解決hash沖突
看下hashtable的定義
typedef struct _zend_array HashTable; struct _zend_array { zend_refcounted_h gc; // gc 相關 union { // 聯合體 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數組 uint32_t *arHash; // hashtable 查找 大小為nTableMask 存放指向bucket的指針(疑問在源碼定義中未看到) uint32_t nNumUsed; // 元素個數 包含已刪除的元素 uint32_t nNumOfElements; // 有效的元素個數 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 如果是數字 則為空 } Bucket; typedef struct _zval_struct zval; struct _zval_struct { zend_value value; // value 真正的結構 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; // 重點關注這個 存放hash 沖突下一個元素的位置 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;
結構圖
上述就是小編為大家分享的PHP中的HashTable是,如果您也有類似的疑惑,不妨礙參照上述分析進行理解。如果想了解更多相關內容,請關注億速云行業資訊。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。