>백엔드 개발 >PHP 문제 >PHP 해시테이블이란 무엇입니까?

PHP 해시테이블이란 무엇입니까?

Guanhui
Guanhui원래의
2020-06-24 14:26:212906검색

PHP 해시테이블이란 무엇입니까?

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 해시테이블이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.