当前位置:网站首页>PHP中Array的hash函数实现

PHP中Array的hash函数实现

2022-07-05 11:22:00 全栈程序员站长

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

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

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

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

1. hash = 5381设置的理由?

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

Php代码

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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/109530.html原文链接:https://javaforall.cn

原网站

版权声明
本文为[全栈程序员站长]所创,转载请带上原文链接,感谢
https://cloud.tencent.com/developer/article/2040563