时间:2021-07-01 10:21:17 帮助过:16人阅读
- <br>static inline ulong zend_inline_hash_func(const char *arKey, uint nKeyLength) <br>{ <br>register ulong hash = 5381; //此处初始值的设置有什么玄机么? <br>/* variant with the hash unrolled eight times */ <br>for (; nKeyLength >= 8; nKeyLength -= 8) { //这种step=8的方式是为何? <br>hash = ((hash << 5) + hash) + *arKey++; <br>hash = ((hash << 5) + hash) + *arKey++; <br>hash = ((hash << 5) + hash) + *arKey++; <br>hash = ((hash << 5) + hash) + *arKey++; //比直接*33要快 <br>hash = ((hash << 5) + hash) + *arKey++; <br>hash = ((hash << 5) + hash) + *arKey++; <br>hash = ((hash << 5) + hash) + *arKey++; <br>hash = ((hash << 5) + hash) + *arKey++; <br>} <br>switch (nKeyLength) { <br>case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ //此处是将剩余的字符hash <br>case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ <br>case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ <br>case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ <br>case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ <br>case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */ <br>case 1: hash = ((hash << 5) + hash) + *arKey++; break; <br>case 0: break; <br>EMPTY_SWITCH_DEFAULT_CASE() <br>} <br>return hash;//返回hash值 <br>} <br> <br>ps:对于以下函数,仍有两点不明: <br>hash = 5381设置的理由? <br>这种step=8的循环方式是为了效率么?