生活随笔
收集整理的這篇文章主要介紹了
PHP的数组结构是用哈希表实现的
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
今天回顧學(xué)習(xí)了PHP中變量實(shí)現(xiàn)的方法,在瀏覽其源碼是發(fā)現(xiàn)在PHP中所有的數(shù)據(jù)類型通過一個(gè)union存儲(chǔ)。php語言是弱類型語言,其實(shí)現(xiàn)中通過記錄變量的類型和值來實(shí)現(xiàn)其管理。
PHP中使用最多的非Array莫屬了,那Array是如何實(shí)現(xiàn)的?在PHP內(nèi)部Array通過一個(gè)hashtable來實(shí)現(xiàn),其中使用鏈接法解決hash沖突的問題,這樣最壞情況下,查找Array元素的復(fù)雜度為O(N),最好則為1.
而其計(jì)算字符串hash值的方法如下,將源碼摘出來以供查備:
view source print?
| 01 | static?inline ulong zend_inline_hash_func(const?char *arKey, uint nKeyLength) |
| 03 | ????register ulong hash = 5381; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??//此處初始值的設(shè)置有什么玄機(jī)么? |
| 04 | ????/* variant with the hash unrolled eight times */ |
| 05 | ????for?(; nKeyLength >= 8; nKeyLength -= 8) { ? ? ? ? ? ? ? ? ? ? ? ??//這種step=8的方式是為何? |
| 06 | ????????hash = ((hash << 5) + hash) + *arKey++; |
| 07 | ????????hash = ((hash << 5) + hash) + *arKey++; |
| 08 | ????????hash = ((hash << 5) + hash) + *arKey++; |
| 09 | ????????hash = ((hash << 5) + hash) + *arKey++; ? ? ? ? ? ? ? ? ? ? ? ??//比直接*33要快 |
| 10 | ????????hash = ((hash << 5) + hash) + *arKey++; |
| 11 | ????????hash = ((hash << 5) + hash) + *arKey++; |
| 12 | ????????hash = ((hash << 5) + hash) + *arKey++; |
| 13 | ????????hash = ((hash << 5) + hash) + *arKey++; |
| 15 | ????switch?(nKeyLength) { |
| 16 | ????????case?7: hash = ((hash << 5) + hash) + *arKey++;?/* fallthrough... */?? ? ? ? ? ? ? ? ? ? ? ? ? ??//此處是將剩余的字符hash |
| 17 | ????????case?6: hash = ((hash << 5) + hash) + *arKey++;?/* fallthrough... */ |
| 18 | ????????case?5: hash = ((hash << 5) + hash) + *arKey++;?/* fallthrough... */ |
| 19 | ????????case?4: hash = ((hash << 5) + hash) + *arKey++;?/* fallthrough... */ |
| 20 | ????????case?3: hash = ((hash << 5) + hash) + *arKey++;?/* fallthrough... */ |
| 21 | ????????case?2: hash = ((hash << 5) + hash) + *arKey++;?/* fallthrough... */?? ? ? ? ? ? ? ? ? ? |
| 22 | ????????case?1: hash = ((hash << 5) + hash) + *arKey++;?break; |
| 23 | ????????case?0:?break; |
| 24 | EMPTY_SWITCH_DEFAULT_CASE() |
| 26 | ????return?hash;//返回hash值 |
ps:對(duì)于以下函數(shù),仍有兩點(diǎn)不明:
hash = 5381設(shè)置的理由?這種step=8的循環(huán)方式是為了效率么?
總結(jié)
以上是生活随笔為你收集整理的PHP的数组结构是用哈希表实现的的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。