PHP中Array的hash函数实现

PHP中Array的hash函数实现





今天回顾学习了PHP中变量实现的方法,在浏览其源码是发现在PHP中所有的数据类型通过一个union存储。

php语言是弱类型语言,其实现中通过记录变量的类型和值来实现其管理。



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

在PHP内部Array通过一个hashtable来实现,其中使用链接法解决hash冲突的问题,这样最坏情况下,查找Array元素的复杂度为O(N),最好则为1.



而其计算字符串hash值的方法如下,将源码摘出来以供查备:

ps:对于以下函数,仍有两点不明:

1.  hash = 5381设置的理由?

2.  这种step=8的循环方式是为了效率么?



Php代码
  1. 1.static inline ulong zend_inline_hash_func(const char *arKey, uint nKeyLength)   
  2. 2.{   
  3. 3.    register ulong hash = 5381;                                                   //此处初始值的设置有什么玄机么?   
  4. 4.  
  5. 5.    /* variant with the hash unrolled eight times */  
  6. 6.    for (; nKeyLength >= 8; nKeyLength -= 8) {                         //这种step=8的方式是为何?   
  7. 7.        hash = ((hash << 5) + hash) + *arKey++;   
  8. 8.        hash = ((hash << 5) + hash) + *arKey++;   
  9. 9.        hash = ((hash << 5) + hash) + *arKey++;   
  10. 10.        hash = ((hash << 5) + hash) + *arKey++;                         //比直接*33要快   
  11. 11.        hash = ((hash << 5) + hash) + *arKey++;   
  12. 12.        hash = ((hash << 5) + hash) + *arKey++;   
  13. 13.        hash = ((hash << 5) + hash) + *arKey++;   
  14. 14.        hash = ((hash << 5) + hash) + *arKey++;   
  15. 15.    }      
  16. 16.    switch (nKeyLength) {   
  17. 17.        case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */                             //此处是将剩余的字符hash   
  18. 18.        case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */  
  19. 19.        case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */  
  20. 20.        case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */  
  21. 21.        case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */  
  22. 22.        case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */                        
  23. 23.        case 1: hash = ((hash << 5) + hash) + *arKey++; break;   
  24. 24.        case 0: break;   
  25. 25.EMPTY_SWITCH_DEFAULT_CASE()   
  26. 26.    }      
  27. 27.    return hash;                                                                //返回hash值   
  28. 28.}  
复制代码

作者: so_brave   发布时间: 2011-05-11

谢谢楼主分享 学习了

作者: ailiu008   发布时间: 2011-05-11