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. }

PHP中Array的hash函数实现的更多相关文章

  1. Java中String的hash函数分析

    转载自:http://blog.csdn.net/hengyunabc/article/details/7198533 JDK6的源码: [java] view plaincopy /** * Ret ...

  2. javascript 中Array.prototype.sort 函数的用法

    来源:http://www.jb51.net/article/5769.htm JavaScript中对变量的操作都是通过引用方式,而对数组也一样. 前两天想要对一个数组进行复制,一直苦于找不到办法( ...

  3. hadoop Partiton中的字符串Hash函数改进

    最近的MapReduce端的Partition根据map生成的Key来进行哈希,导致哈希出来的Reduce端处理任务数量非常不均匀,有些Reduce端处理的数据量非常小(几分钟就执行完成,而最后的pa ...

  4. js中Array的map()函数,其中的回调函数还能这么用

    <!DOCTYPE html><html><head><meta charset="utf-8"><title>菜鸟教程 ...

  5. 使用模拟退火算法优化 Hash 函数

    背景 现有个处理股票行情消息的系统,其架构如下: 由于数据量巨大,系统中启动了 15 个线程来消费行情消息.消息分配的策略较为简单:对 symbol 的 hashCode 取模,将消息分配给其中一个线 ...

  6. Hash函数及其应用

    本文部分内容摘自网络,参考资料链接会在文后给出,在此感谢原作者的分享. 计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数 ...

  7. 密码学Hash函数

    定义: Hash函数H将可变长度的数据块M作为输入,产生固定长度的Hash值h = H(M). 称M是h的原像.因为H是多对一的映射,所以对于任意给定的Hash值h,对应有多个原像.如果满足x≠y且H ...

  8. 应用Hash函数

    本文系转载,转自:http://www.blogjava.net/jinfei0627/articles/219543.html 应用Hash函数(java描述) 作者:冲处宇宙 时间:2007.1. ...

  9. 密码学hash函数-SHA256-512

    [latexpage] Hash函数又称哈希函数.散列函数.杂凑函数.它是一种单向密码体制,即从一个从明文到密文的不可逆映射,只有加密过程,没有解密过程. Hash函数H将可变长度的数据块M作为输入, ...

随机推荐

  1. login.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  2. 架构-LAMP特级学习(网站服务器监控)

    1.服务监控(SNMP配合CACTI监控) Apache Web服务监控 MySQL数据库监控 磁盘空间监控 2.流量监控(SNMP配合MRTG监控) 网站流量监控 3.使用SNMP可以获取被监控服务 ...

  3. Java语言中的面向对象特性:封装、继承、多态,面向对象的基本思想(总结得不错)

    Java语言中的面向对象特性(总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知道jav ...

  4. UltraEdit加入到右键菜单中

    http://www.cppblog.com/prayer/archive/2009/02/20/74429.htmlUltraEdit安装好之后,拷贝到其它机器就可以直接使用而无需注册,但少了一个功 ...

  5. 什么是Asterisk,它如何帮助我们的呼叫中心?

    如今的呼叫中心与过去的呼叫中心有很大差异.过去,一间房屋或一座大楼,装上硬接线的POTS电话,招聘几名员工就可以建立一个呼叫中心.如今,这样的情形已经一去不复返,因为有许多新技术让呼叫中心变得更像是一 ...

  6. 多进程对 MySQL update的影响

    今天要做数据清洗的时候,要更新一个数据库字段,考虑到用多进程去更新数据库,也许程序会跑得快一些,结果开了64个进程, 结果是其他程序更新的时候,速度非常慢,最后发现的原因是,数据库中有64个SQL语句 ...

  7. java与数据库交互常用到的一些方法

    下面我整理了一下java中常用的几个与数据库交互的常用方法,仅供参考: 1.执行SQL(dao层的实现类中) (1)SQL查询: //import org.hibernate.Query;//impo ...

  8. MySQL变量的定义与赋值

    MySQL存储过程中,定义变量有两种方式:1.使用set或select直接赋值,变量名以 @ 开头.例如:set @var=1;可以在一个会话的任何地方声明,作用域是整个会话,称为会话变量. 2.以 ...

  9. Centos网络配置小工具

    之前在CentOS 6下编辑网卡,直接使用setup工具就可以了. 但在新版的CentOS 7里,setuptool已经没有网络编辑组件了,取而代之的是NetworkManager Text User ...

  10. storm配置:如何解决worker进程内存过小的问题

    问题导读1.如何设置storm内存?2.如果没有配置文件的情况下,该如何配置一些参数?3.通过哪个参数可以配置内存? Storm中真正干活的是各个worker,而worker由supervisor负责 ...