ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# hashtable的数据结构 > hashtable描述了【变量】和【zval容器】之间的联系 ## 随机读写 ![](https://box.kancloud.cn/79871233e962342c850236a3300578a3_624x293.png) 1. 实例 $array = ['key' => 'value']; 2. 通过hash算法Time 33 将key 转换成 int类型的整数 18003212 = hash('key') 3. 将hash code 取hash值映射到指定的Bucket,(通过特定算法将hash code 映射到Bucket下标) 4. 将value写入Bucket ## 顺序读写 ![](https://box.kancloud.cn/7ef263f32d96cb9d35654701ddde2205_632x375.png) 为了实现hashtable的顺序读写,在Bucket层上方新增了中间链表层,用来保存Bucket节点的顺序。中间映射表具有和Bucket层相同的大小和下表指针。 具体的做法如下: 1. 通过hash code 计算散列值nIndex (内存空间指针) 2. 通过指针定位中间映射表的具体位置,写入Bucket位置 3. Bucket按照顺序写入,方便对hashtable的顺序读取 ## hash冲突 通过散列函数计算hash code 得到散列值nIndex,会出现值相同的情况,称之为哈希冲突。解决哈希冲突的方法有如下几种: * 链表址法 ### 查询 将冲突的Bucket元素串成链表,中间映射表保存指向该链表的指针,使用key通过散列函数定位Bucket链表时,会遍历链表,通过对比链表的数值域的值和key,找到目标元素。 ### 插入 1. 旧元素的下标保存到新元素的指针域 2. 新元素的下标保存到中间映射表