抽厉 发表于 2025-5-29 00:09:54

[PHP内核探索]PHP中的哈希表

在PHP内核中,其中一个很重要的数据结构就是HashTable。我们常用的数组,在内核中就是用HashTable来实现。那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据结构,但是算法书籍里面没有具体的实现算法,刚好最近也在阅读PHP的源码,于是参考PHP的HashTable的实现,自己实现了一个简易版的HashTable,总结了一些心得,下面给大家分享一下。
笔者github上有一个简易版的HashTable的实现:HashTable实现
另外,我在github有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。
HashTable的介绍

哈希表是实现字典操作的一种有效数据结构。
定义

简单地说,HashTable(哈希表)就是一种键值对的数据结构。支持插入,查找,删除等操作。在一些合理的假设下,在哈希表中的所有操作的时间复杂度是O(1)(对相关证明感兴趣的可以自行查阅)。
实现哈希表的关键

在哈希表中,不是使用关键字做下标,而是通过哈希函数计算出key的哈希值作为下标,然后查找/删除时再计算出key的哈希值,从而快速定位元素保存的位置。
在一个哈希表中,不同的关键字可能会计算得到相同的哈希值,这叫做“哈希冲突”,就是处理两个或多个键的哈希值相同的情况。解决哈希冲突的方法有很多,开放寻址法,拉链法等等。
因此,实现一个好的哈希表的关键就是一个好的哈希函数和处理哈希冲突的方法。
Hash函数

判断一个哈希算法的好坏有以下四个定义:


[*]一致性,等价的键必然产生相等的哈希值;
[*]高效性,计算简便;
[*]均匀性,均匀地对所有的键进行哈希。
哈希函数建立了关键值与哈希值的对应关系,即:h = hash_func(key)。对应关系见下图:

设计一个完美的哈希函数就交由专家去做吧,我们只管用已有的较成熟的哈希函数就好了。PHP内核使用的哈希函数是time33函数,又叫DJBX33A,其实现如下:
static inline ulong zend_inline_hash_func(const char *arKey, uint nKeyLength){         register ulong hash = 5381;      /* variant with the hash unrolled eight times */      for (; nKeyLength >= 8; nKeyLength -= 8) {            hash = ((hash

柯惠心 发表于 2025-10-29 01:16:30

这个好,看起来很实用

剩鹄逅 发表于 2025-11-27 01:08:49

感谢分享,学习下。

劳暄美 发表于 2026-1-3 12:06:55

前排留名,哈哈哈

宛蛲 发表于 2026-1-5 07:16:27

用心讨论,共获提升!

涂流如 发表于 2026-1-13 05:11:36

懂技术并乐意极积无私分享的人越来越少。珍惜

寇油 发表于 2026-1-14 19:58:01

很好很强大我过来先占个楼 待编辑

宁觅波 发表于 2026-1-15 20:09:27

感谢发布原创作品,程序园因你更精彩

杠氯 发表于 2026-1-17 04:20:25

东西不错很实用谢谢分享

金娅鸣 发表于 2026-1-17 13:15:22

这个有用。

撙仿 发表于 2026-1-18 05:36:07

喜欢鼓捣这些软件,现在用得少,谢谢分享!

幌斛者 发表于 2026-1-18 20:58:16

谢谢分享,辛苦了

呵烘稿 发表于 2026-1-20 23:27:30

不错,里面软件多更新就更好了

毋峻舷 发表于 2026-1-23 08:18:08

东西不错很实用谢谢分享

处匈跑 发表于 2026-1-24 11:08:46

热心回复!

祝安芙 发表于 2026-1-25 03:22:22

谢谢分享,试用一下

方子楠 发表于 2026-1-25 13:46:54

东西不错很实用谢谢分享

钦娅芬 发表于 2026-1-27 05:59:37

这个有用。

卓卞恻 发表于 2026-1-27 06:03:22

很好很强大我过来先占个楼 待编辑

肇默步 发表于 2026-1-27 08:47:33

热心回复!
页: [1] 2
查看完整版本: [PHP内核探索]PHP中的哈希表