这期内容当中的小编将会给大家带来有关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表的掩码 用来确定hshBucket *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 值 用来寻找对比keyzend_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是,如果您也有类似的疑惑,不妨碍参照上述分析进行理解。如果想了解更多相关内容,请关注亿速云行业资讯。