中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中的HashTable是指什么

發布時間:2020-06-24 15:58:51 來源:億速云 閱讀:127 作者:元一 欄目:編程語言

這期內容當中的小編將會給大家帶來有關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是指什么

上述就是小編為大家分享的PHP中的HashTable是,如果您也有類似的疑惑,不妨礙參照上述分析進行理解。如果想了解更多相關內容,請關注億速云行業資訊。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

屏南县| 南投县| 厦门市| 吉安市| 彰武县| 临西县| 永吉县| 宜川县| 东安县| 佛学| 峨眉山市| 宿迁市| 白银市| 思茅市| 新巴尔虎右旗| 金门县| 翼城县| 高密市| 镇坪县| 永济市| 广昌县| 安徽省| 白山市| 苍南县| 河间市| 龙胜| 平昌县| 宁南县| 安庆市| 高邮市| 伊金霍洛旗| 屏东市| 清原| 武穴市| 香河县| 深水埗区| 凤山县| 杭锦后旗| 马关县| 龙胜| 大田县|