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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • RPN网络

    RPN网络RPN思路:1、先通过conv层+pooling层+relu层,可以是vgg,得到featuremaps。2、在featuremaps上提取对应的图。在第一步基础上,先通过rpn生成regionproposals。通过softmax判断anchors(9个框),是foreground还是background,再通过boundingboxregression…

    2022年6月23日
    33
  • 八种基本数据类型_uint16是什么数据类型

    八种基本数据类型_uint16是什么数据类型uint8_t/uint16_t/uint32_t/uint64_t 是什么数据类型在nesc的代码中,你会看到很多你不认识的数据类型,比如uint8_t等。咋一看,好像是个新的数据类型,不过C语言(nesc是C的扩展)里面好像没有这种数据类型啊!怎么

    2022年9月7日
    3
  • informix错误代码_大师剑bug

    informix错误代码_大师剑bugRecommendedFixesforInformixServerProductsProductdocumentationAbstractAcomprehensivelistofrecommendedfixesforInformixServerproductreleases.ContentLastModified:March22,2012R

    2022年10月21日
    3
  • CNN简单实战:pytorch搭建CNN对猫狗图片进行分类

    CNN简单实战:pytorch搭建CNN对猫狗图片进行分类上一篇文章介绍了使用pytorch的Dataset和Dataloader处理图片数据,现在就用处理好的数据对搭建的CNN进行训练以及测试。

    2022年6月12日
    25
  • linux平台 ora 12154,ORA-12154 TNS 无法解析指定的连接标识符

    linux平台 ora 12154,ORA-12154 TNS 无法解析指定的连接标识符ORA-12154TNS无法解析指定的连接标识符[日期:2011-12-27]来源:Linux社区作者:love_UbuntuORA-12154TNS无法解析指定的连接标识符.今天数据库突然连接时报这个错误,plsql连接不上,应用程序连接不上,但是sql可以连上。到网上找了半天,也改了半天。其实我的listener.ora文件是一直没有动的。网上的人说改了之后重启服务就可以。目…

    2022年7月24日
    12
  • 算法时间复杂度分析(一)

    算法时间复杂度分析(一)金庸武侠中描述一种武功招式的时候,经常会用到“快、准、狠”这3个字眼。同样,在计算机中我们衡量一种算法的执行效率的时候也会考量3个方面:“快、省、稳”。具体点来讲就是我们在实现某一种算法的时候,最终目的就是要求计算机(CPU)在最短的时间内,用最少的内存稳定的输出正确的结果。这一章节主要来理解“快”,至于“省”和“稳”,我会在后续章节进行讲解。那如何来判断某一段代码运行的是否足够快呢…

    2022年5月14日
    48

发表回复

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

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