《PHP核心技术与实践》PHP内核中的HashTable分析

php中文网
发布: 2016-06-23 13:15:25
原创
947人浏览过

  1. hashtable是php的灵魂,因为在zend引擎中大量地使用了hasttable,如变量表,常量表,函数表,数组等,所以了解hashtable对真正了解php很重要!
  2. php内核中hashtable的数据结构: php的hashtable同时维护一个双向链表,而这个双向链表是通过plistnext和plistlast这两个成员变量维护的。 成员变量中,pdata和pdatastr较容易混淆,pdata指向的是想要保存的内存块地址,一般是通过malloc之类的系统调用分配出来,但是有时候只想保存一个指针,如果这样也去调用malloc之类的系统调用分配内存会导致产生内存碎片,这种情况php内核是不能容忍的,所以出现了pdataptr指针。pdataptr的指针就是当想保存一个指针类型的数据时,就直接保存到pdataptr成员变量中,而不调用malloc分配内存,从而防止了内存碎片的产生,然后pdata直接指向pdataptr,当要保存的数据不是指针时,pdataptr被设置为null.

要找到某个保存在hashtable中的数据,则是通过索引(key),每个元素都有一个索引且不同,通过索引可以找到这个元素且可取得保存在里面的数据。索引保存在hashtable的最后一个成员arkey起始位置的长nkeylength的内存中,虽然arkey只有一个字节,但这里使用了c语言的一个常用技巧(flesible array),通过申请sizeof(bucket)+nkeylength大小的内存,然后把索引保存到arkey成员中。

但如果索引为整数,本来也可以把整数当成字符串处理,但PHP不这样做,而是利用一个技巧来解决。当索引为整数时,PHP把索引保存到Bucket结构体的h成员变量中,然后把nKeyLength设置为0,表示这是一个整数而不是字符串,所以当nKeyLength大于0时,可在arKey中取到索引,而当nKeyLength等于0时,就在h中取得索引,那当nKeyLength为0时h成员变量是不是没有用呢?其实不然,当nKeyLength大于0时(索引为字符串时),h成员保存的是索引经过hash函数处理之后的值,这样做的好处就是,在重hash时不用重新计算索引的hash值。(hash函数得到的是一个整形数,所以可以保存在ulong h;中,可用来做下标)

百度文心百中
百度文心百中

百度大模型语义搜索体验中心

百度文心百中 22
查看详情 百度文心百中
  1. HashTable结构体分析,几图示:

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号