PHP中Array的hash函数实现

PHP中Array的hash函数实现

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.   
  5.     /* variant with the hash unrolled eight times */  
  6.     for (; nKeyLength >= 8; nKeyLength -= 8) {                         //这种step=8的方式是为何?  
  7.         hash = ((hash << 5) + hash) + *arKey++;  
  8.         hash = ((hash << 5) + hash) + *arKey++;  
  9.         hash = ((hash << 5) + hash) + *arKey++;  
  10.         hash = ((hash << 5) + hash) + *arKey++;                         //比直接*33要快  
  11.         hash = ((hash << 5) + hash) + *arKey++;  
  12.         hash = ((hash << 5) + hash) + *arKey++;  
  13.         hash = ((hash << 5) + hash) + *arKey++;  
  14.         hash = ((hash << 5) + hash) + *arKey++;  
  15.     }     
  16.     switch (nKeyLength) {  
  17.         case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough… */                             //此处是将剩余的字符hash  
  18.         case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough… */  
  19.         case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough… */  
  20.         case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough… */  
  21.         case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough… */  
  22.         case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough… */                       
  23.         case 1: hash = ((hash << 5) + hash) + *arKey++; break;  
  24.         case 0: break;  
  25. EMPTY_SWITCH_DEFAULT_CASE()  
  26.     }     
  27.     return hash;                                                                //返回hash值  
  28. }  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 解决github下载慢及–recursive慢的问题(亲测好用)[通俗易懂]

    在gitclone的地址,例如https://github.com/pytorch/pytorch,改为https://gitclone.com/github.com/pytorch/pytorch,也即加上前缀gitclone.com,然后就可以愉快的下载了(亲测有效)。对于子模块,可以先不要在gitclone的时候加上–recursive,等主体部分下载完之后,该文件夹中有个隐藏文件称为:.gitmodules,把子项目中的url地址同样加上gitclone.com前缀,然后利用gits..

    2022年4月12日
  • pycharm 重装后双击无反应的一种解决方法

    pycharm 重装后双击无反应的一种解决方法问题描述之前安装的2018版本的pycharm,更新失败之后自动删除,所以重装了一个2020.1,然后发现双击无反应。解决方法用下面方法解决后,记录一下过程:在“添加和删除程序”中发现了pycharm2018版本的程序名,但目录文件已被删除。于是通过注册表编辑器(cmd输入regedit),在编辑→查找中查找pycharm发现了pycharm2018项,将其删除后添加或删除程序里…

    2022年8月26日
  • windows route命令[通俗易懂]

    windows route命令[通俗易懂]命令:routeprint:打印当前的路由表routedelete:删除一条路由routeadd:增加一条路由,如果最后加上–p选项,表示永久增加静态路由,重启后不会失效routechange:更改一条路由例:routeCHANGE157.0.0.0MASK255.0.0.0157.55.80.5METRIC2IF2CHANGE只用于修改网关和/或跃点数。具体场景:一台电脑通过双网卡,同时连接内网与外网.内网地址10.0.

    2022年7月18日
  • php中urldecode()和urlencode()起什么作用啊

    php中urldecode()和urlencode()起什么作用啊

    2021年9月22日
  • 最炫python表白代码_有趣的python代码表白

    最炫python表白代码_有趣的python代码表白文章目录前言演示网站制作部署网站二维码制作总结前言跟着我做,不要跳着看,否则你会失败。第一步是制作二维码;第二步是制作网站。演示具体成果地址:https://yanghanwen.xyz/ai/网站制作首先你需要下载我的这个完整项目:链接:https://pan.baidu.com/s/1EmRehx_gRnT5hLjJvKuAIg提取码:pz1y–来自百度网盘超级会员V2的分享下载好后文件目录如下:然后你需要注意的是我把img里面的图片删了,涉及隐私,大家自己替换自己追

    2022年8月30日
  • 如何调用静态方法

    如何调用静态方法

    2022年4月2日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号