# 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. 新元素的下标保存到中间映射表