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: