`

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的循环方式是为了效率么?

 

static inline ulong zend_inline_hash_func(const char *arKey, uint nKeyLength)
{
    register ulong hash = 5381;                                                   //此处初始值的设置有什么玄机么?

    /* variant with the hash unrolled eight times */
    for (; nKeyLength >= 8; nKeyLength -= 8) {                         //这种step=8的方式是为何?
        hash = ((hash << 5) + hash) + *arKey++;
        hash = ((hash << 5) + hash) + *arKey++;
        hash = ((hash << 5) + hash) + *arKey++;
        hash = ((hash << 5) + hash) + *arKey++;                         //比直接*33要快
        hash = ((hash << 5) + hash) + *arKey++;
        hash = ((hash << 5) + hash) + *arKey++;
        hash = ((hash << 5) + hash) + *arKey++;
        hash = ((hash << 5) + hash) + *arKey++;
    }   
    switch (nKeyLength) {
        case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */                             //此处是将剩余的字符hash
        case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
        case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
        case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
        case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
        case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */                     
        case 1: hash = ((hash << 5) + hash) + *arKey++; break;
        case 0: break;
EMPTY_SWITCH_DEFAULT_CASE()
    }   
    return hash;                                                                //返回hash值
}

 

1
2
分享到:
评论

相关推荐

    PHP函数速查效率手册 source code

    本书共分21章,PHP函数所涉及的范围包括MySQL服务器、Apache服务器、ODBC、String字符串、Array数组、Variable函数、时间日期、Hash、正则表达式、Session、Math、Filesystem、Directories、Mail、HTTP、URL、FTP、...

    PHP函数库查询辞典

    《PHP函数库查询辞典》是一部详尽的资源,旨在为PHP开发者提供全面的函数参考。PHP(Hypertext Preprocessor)是一种...在实际开发过程中,结合PHP手册和在线资源,可以更好地理解和应用这些函数,提升代码质量和效率。

    PHP的array_diff()函数在处理大数组时的效率问题

    php /** * 解决 php 5.2.6 以上版本 array_diff() 函数在处理 * 大数组时的需要花费超长时间的问题 * * 整理:http://www.CodeBit.cn * 来源:http://bugs.php.net/47643 */ function array_diff_fast($data1, $data...

    PHP中用hash实现的数组

    PHP中使用最多的非Array莫属了,那Array是如何实现的?在PHP内部Array通过一个hashtable来实现,其中使用链接法解决hash冲突的问题,这样最坏情况下,查找Array元素的复杂度为O(N),最好则为1. 而其计算字符串hash值...

    利用PHP实现Hash表功能_.docx

    在本文档中,我们将探讨如何使用PHP实现哈希表(Hash表)功能。哈希表是一种数据结构,它通过将键(Key)映射到数组中的特定位置来存储和检索数据,从而提供快速访问。哈希函数是这个过程的关键,它将任意长度的键...

    PHP常用函数总结

    以上仅是PHP众多函数中的一部分,PHP还包含大量其他函数,用于XML解析、网络通信、图像处理、会话管理等多个领域。熟练掌握这些函数的用法,将有助于提高PHP开发效率和代码质量。在实际开发中,应根据项目需求选择...

    php常用函数总结.xls

    这些只是PHP众多函数中的一部分,实际使用中还有许多其他函数,如数学函数、XML处理函数、邮件发送函数等。熟悉并掌握这些函数将极大地提升PHP开发效率和代码质量。"php常用函数总结.xls"文件提供了一个很好的参考...

    php常用函数参考(方便,全面)

    以上只是PHP众多函数中的一部分,完整的"PHP常用函数手册"会包含更多细节,例如每种函数的参数、返回值、注意事项以及示例,帮助开发者更深入地理解和运用这些函数。在实际开发中,理解并熟练掌握这些函数,将有助于...

    PHP实现普通hash分布式算法简单示例

    在PHP中实现一个简单的哈希分布式算法可以通过定义一个类来完成。该类中至少包含两个方法:一个用于计算数据的哈希值(myHash),另一个用于根据哈希值选取相应的服务器(getServer)。 我们来看具体的代码示例: ...

    php模拟区块链利用array数组直观理解区块链结构.zip

    在本资源中,我们通过PHP中的array数组来模拟区块链,帮助初学者更直观地理解其工作原理。 首先,我们需要理解区块链的基本构成。每个区块(Block)通常包含三部分:区块头(Header)、交易数据(Transactions)和...

    PHP Extension writing

    在PHP扩展中,可以通过编写C语言函数并将其暴露给PHP来实现自定义的功能。这些函数可以在PHP脚本中像普通PHP函数一样被调用。 1. **函数声明**: 定义函数原型,指定参数列表和返回类型。 2. **函数实现**: 实现具体的...

    PHP + Redis 实现布隆过滤器,防止缓存被击穿.zip

    在IT行业中,尤其是在Web开发领域,缓存是提高系统性能的关键技术之一。...当然,这只是一个基础实现,实际项目中可能需要根据业务需求进行优化,例如使用更高效的哈希函数、考虑布隆过滤器的扩容策略等。

    PHP的password_hash()使用实例

    string password_hash(string $password, integer $algo[, array $options]) ``` 这个函数接收三个参数:密码($password)、哈希算法($algo)、选项($options)。其中密码和哈希算法是必须的,选项是可选的。哈希...

    PHP必备工具书:PHP FAQ 由浅入深,解答PHP实际应用可能出现的疑问

    - 数组处理:了解数组的创建、遍历、排序及合并等,熟悉array_push、array_pop、sort、rsort等函数。 3. 文件系统操作: - 文件读写:学习如何使用fopen、fread、fwrite、fclose等函数进行文件操作。 - 目录操作...

    PHP常用库函数的专用文档

    以上只是PHP库函数的一部分,实际中还有更多功能强大的函数等待开发者去探索和利用。通过熟练掌握这些库函数,可以极大地提高PHP编程的效率和代码质量,实现复杂的功能,满足多样化的项目需求。在开发过程中,适时...

    PHP5 完整官方 中文教程

    Arrays — Array 数组函数 Aspell — Aspell 函数(已废弃) BBCode — BBCode Functions BC math — BC math 高精度数学函数 bcompiler — BCompiler PHP 字节码编译器 Bzip2 — Bzip2 压缩函数 Calendar — ...

    最全最新中文版PHP-7.0手册下载-.chm格式-2015年11月26日

    在函数方面,手册涵盖了内置的PHP函数,如字符串函数(如strlen、str_replace)、数组函数(如array_push、array_pop)、数学函数(如sin、pow)等。此外,还介绍了错误处理和异常处理机制,这对于编写健壮的代码至...

    php编程,php中文手册

    14. **PHP与前端技术结合**:例如,通过AJAX实现页面异步更新,配合jQuery等JavaScript库提升用户体验。 15. **安全问题**:防止SQL注入、XSS跨站脚本攻击,使用`htmlspecialchars`转义特殊字符,`password_hash`和...

    PHP5.5中文手册

    8. **新函数和改进**:例如`password_hash()`和`password_verify()`用于安全地存储和验证密码,`intl`扩展的增强,以及`json_last_error_msg()`等新的JSON处理函数。 9. **错误处理**:PHP5.5引入了异常处理机制,...

    经纬度地址编码geohash.zip

    这个php扩展,提供了三个函数:/**  * $latitude //纬度  * $longitude //经度  * $precision //精密度, 默认是12  * 返回 $precision 长度的 string  */  geohash_encode($latitude, $longitude...

Global site tag (gtag.js) - Google Analytics