PHP 해시테이블이란 무엇인가요?
PHP HashTable은 키 값을 기준으로 직접 접근하는 데이터 구조인 해시 테이블을 말합니다. 즉, 키 값을 테이블 내 위치에 매핑하여 레코드에 접근할 수 있어 검색 속도가 빨라집니다. 그 중 레코드를 저장하는 배열이 해시 테이블이다.
HashTable의 새 버전
Hashtable의 이전 버전에 비해 변경 사항이 상당히 큽니다.
이전 버전의 요소 저장소는 Bucket **arBuckets에 포인터가 가리키는 주소가 저장되어 있습니다. 새 버전 요소 저장은 연속적입니다. Bucket *arData
이전 버전에서는 버킷에 포인터가 4개 있었지만 새 버전에서는 버킷에 포인터가 하나만 사용됩니다. 해시 충돌
이 누락된 경우 세 개의 포인터, 새 버전의 해시 테이블이 어떻게 삽입 순서로 해시 충돌을 탐색하고 해결할 수 있는지 살펴보겠습니다.
해시 테이블의 정의를 살펴보세요
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; };
버킷 정의
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》
위 내용은 PHP 해시테이블이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!