# hashtable的數據結構
> hashtable描述了【變量】和【zval容器】之間的聯系
## 隨機讀寫

1. 實例
$array = ['key' => 'value'];
2. 通過hash算法Time 33 將key 轉換成 int類型的整數
18003212 = hash('key')
3. 將hash code 取hash值映射到指定的Bucket,(通過特定算法將hash code 映射到Bucket下標)
4. 將value寫入Bucket
## 順序讀寫

為了實現hashtable的順序讀寫,在Bucket層上方新增了中間鏈表層,用來保存Bucket節點的順序。中間映射表具有和Bucket層相同的大小和下表指針。
具體的做法如下:
1. 通過hash code 計算散列值nIndex (內存空間指針)
2. 通過指針定位中間映射表的具體位置,寫入Bucket位置
3. Bucket按照順序寫入,方便對hashtable的順序讀取
## hash沖突
通過散列函數計算hash code 得到散列值nIndex,會出現值相同的情況,稱之為哈希沖突。解決哈希沖突的方法有如下幾種:
* 鏈表址法
### 查詢
將沖突的Bucket元素串成鏈表,中間映射表保存指向該鏈表的指針,使用key通過散列函數定位Bucket鏈表時,會遍歷鏈表,通過對比鏈表的數值域的值和key,找到目標元素。
### 插入
1. 舊元素的下標保存到新元素的指針域
2. 新元素的下標保存到中間映射表