PHP數組實現方式

數組是PHP最常用,最強大的數據類型了。我們知道PHP是C寫的,而C語言當中數組是一塊連續的存儲空間,並且只能以數字作爲數組下標。PHP當中則可以使用關聯數組,主要是因爲PHP使用哈希表來作爲數組的存儲方式。
簡單來說,哈希表就是將我們動態分配的數組的下標通過哈希函數算出一個值,然後通過一張轉換表(如果直接存放,可能會順序不對),將真正的數據存放到Bucket結構體當中。正是因爲這個轉換的操作,所以PHP中使用foreach會比使用for更快,foreach直接遍歷的是存放真實數據的Bucket結構部分。
PHP在實現數組類型主要使用了2個結構體一個hashTable,一個Bucket。通過鏈接法來解決hash衝突。當數據達到一定量,或者哈希函數設計不合理,就會發生哈希衝突,PHP使用的是time33哈希算法。因爲算法已知,很多黑客可以通過這個來對網站或者程序進行攻擊(dos攻擊),PHP採用的是禁止用戶提交的數據量來解決這個問題。。
當發生哈希衝突時,需要在鏈表中(爲了解決衝突的雙向鏈表)比較當前節點的鍵名是否正確,否則繼續向下查找。PHP7中鏈表結構並沒像傳統鏈表一樣在在內存中分散存儲。我們直接讀取 arData 整個數組,而不是通過堆(heap)獲取內存地址分散的指針。這是 PHP7 性能提升的一個重要點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章