PHP HashTable是什麼?

2020-07-16 10:06:25

PHP HashTable是什麼?

PHP HashTable是指雜湊表,是根據關鍵碼值而直接進行存取的資料結構,也就是它可以通過把關鍵碼值對映到表中一個位置來存取記錄,從而可以加快查詢的速度,其中存放記錄的陣列就是雜湊表。

新版本的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;

結構圖

Snipaste_2020-06-24_14-23-46.png

推薦教學:《PHP

以上就是PHP HashTable是什麼?的詳細內容,更多請關注TW511.COM其它相關文章!