当前位置:Gxlcms > PHP教程 > PHP中用hash实现的数组_php技巧

PHP中用hash实现的数组_php技巧

时间:2021-07-01 10:21:17 帮助过:16人阅读

PHP中使用最多的非Array莫属了,那Array是如何实现的?在PHP内部Array通过一个hashtable来实现,其中使用链接法解决hash冲突的问题,这样最坏情况下,查找Array元素的复杂度为O(N),最好则为1.
而其计算字符串hash值的方法如下,将源码摘出来以供查备:
代码如下:
  1. <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的循环方式是为了效率么?

人气教程排行