zoukankan      html  css  js  c++  java
  • PHP中Array的hash函数实现

    简介:这是PHP中Array的hash函数实现的详细页面,介绍了和php,有关的知识、技巧、经验,和一些php源码等。

    class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=335092' scrolling='no'>

    今天回顾学习了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值
    }
    

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

    爱J2EE关注Java迈克尔杰克逊视频站JSON在线工具

    http://biancheng.dnbcw.info/php/335092.html pageNo:10
  • 相关阅读:
    Legacy和UEFI,MBR和GPT的区别
    如何升级laravel5.4到laravel5.5并使用新特性?
    value toDF is not a member of org.apache.spark.rdd.RDD
    spark能传递外部命名参数给main函数吗?
    spark在idea中本地如何运行?(处理问题NoSuchFieldException: SHUTDOWN_HOOK_PRIORITY)
    工作随笔-20171012
    maven使用实战
    介绍maven构建的生命周期
    python中的pip
    python中的None
  • 原文地址:https://www.cnblogs.com/ooooo/p/2247911.html
Copyright © 2011-2022 走看看