PHP中Array的hash函數實現

來源:互聯網
上載者:User

簡介:這是PHP中Array的hash函數實現的詳細頁面,介紹了和php,有關的知識、技巧、經驗,和一些php源碼等。

class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=335092' scrolling='no'>

今天回顧學習了PHP中變數實現的方法,在瀏覽其源碼是發現在PHP中所有的資料類型通過一個union儲存。

php語言是弱類型語言,其實現中通過記錄變數的類型和值來實現其管理。

PHP中使用最多的非Array莫屬了,那Array是如何?的?

在PHP內部Array通過一個hashtable來實現,其中使用連結法解決hash衝突的問題,這樣最壞情況下,尋找Array元素的複雜度為O(N),最好則為1.

而其計算字串hash值的方法如下,將源碼摘出來以供查備:

ps:對於以下函數,仍有兩點不明:

1. hash = 5381設定的理由?

2. 這種step=8的迴圈方式是為了效率嗎?

static inline ulong zend_inline_hash_func(const char *arKey, uint nKeyLength){    register ulong hash = 5381;                                                   //此處初始值的設定有什麼玄機嗎?    /* variant with the hash unrolled eight times */    for (; nKeyLength >= 8; nKeyLength -= 8) {                         //這種step=8的方式是為何?        hash = ((hash << 5) + hash) + *arKey++;        hash = ((hash << 5) + hash) + *arKey++;        hash = ((hash << 5) + hash) + *arKey++;        hash = ((hash << 5) + hash) + *arKey++;                         //比直接*33要快        hash = ((hash << 5) + hash) + *arKey++;        hash = ((hash << 5) + hash) + *arKey++;        hash = ((hash << 5) + hash) + *arKey++;        hash = ((hash << 5) + hash) + *arKey++;    }       switch (nKeyLength) {        case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */                             //此處是將剩餘的字元hash        case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */        case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */        case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */        case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */        case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */                             case 1: hash = ((hash << 5) + hash) + *arKey++; break;        case 0: break;EMPTY_SWITCH_DEFAULT_CASE()    }       return hash;                                                                //返回hash值}

“PHP中Array的hash函數實現”的更多相關文章 》

愛J2EE關注Java邁克爾傑克遜視頻站JSON線上工具

http://biancheng.dnbcw.info/php/335092.html pageNo:10

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.