这期内容当中的小编将会给大家带来有关PHP中HashTable的介绍,以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
HashTable是什么?
常见功能
在哈希表中添加一个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是,如果您也有类似的疑惑,不妨碍参照上述分析进行理解。如果想了解更多相关内容,请关注亿速云行业资讯。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。