Home >Backend Development >PHP Tutorial >PHP's array structure is implemented using hash tables_PHP tutorial

PHP's array structure is implemented using hash tables_PHP tutorial

WBOY
WBOYOriginal
2016-07-13 10:33:12703browse

Today I reviewed and learned the method of implementing variables in PHP. When browsing the source code, I found that all data types in PHP are stored through a union. The PHP language is a weakly typed language, and its implementation is managed by recording the type and value of variables.

Array is the most used one in PHP. So how is Array implemented? In PHP, Array is implemented through a hashtable, in which the chaining method is used to solve the problem of hash conflicts. In this way, the complexity of finding Array elements is O(N) in the worst case, and 1 in the best case.

The method of calculating the string hash value is as follows, extract the source code for reference:

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值
}

ps: There are still two things unclear about the following functions:

  1. Reason for setting hash = 5381?
  2. Is this step=8 loop method for efficiency?

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/752526.htmlTechArticleToday I reviewed and learned the method of variable implementation in PHP. When browsing the source code, I found all the data types in PHP. Stored through a union. The php language is a weakly typed language, and its implementation is implemented through...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn