PHP Hash表结构说明

熟悉PHP的同学都知道PHP的数组使用Hash表来实现的,究竟Hash表的结构具体是什么样子的呢?不一定每个人都很清楚,这里详细介绍一下:

HashTable结构说明:

        

  1. uint nTableSize    
              

    • 指定了HashTable的大小,同时它限定了HashTable中能保存Bucket的最大数量此数越大,系统为HashTable分配的内存就越多。为了提高计算效率,系统自动会将nTableSize调整到最小一个不小于nTableSize的2 的整数次方
    •         

    • 该值限制的是桶链表的个数,而不是桶的最大个数
    •     

        

  2.     

  3. uint nTableMask    
              

    • nTableMask的值永远是nTableSize – 1,引入这个字段的主要目的是为了提高计算效率
    •         

    • 写入hash表的数据都需要先通过hash函数将key哈希为一个无符号整数,通过该无符号整数与nTableMask做“按位与”操作,得出应该放到哪个链表中;
    •     

        

  4.     

  5. uint nNumOfElements    
              

    • 记录HashTable当前保存的数据元素的个数
    •     

        

  6.     

  7. ulong nNextFreeElement    
              

    • 记录HashTable中下一个可用于插入数据元素的arBuckets的索引
    •         

    • ???
    •     

        

  8.     

  9. Bucket *pInternalPointer    
              

    • 用于遍历hash表
    •     

        

  10.     

  11. Bucket *pListHead    
              

    • Hash表中所有元素的一个双向链表的表头
    •         

    • 不同于桶链表,桶链表靠的是Bucket中的,pNext 和 pLast;该整个链表中的是pListNext和pListLast;
    •     

        

  12.     

  13. Bucket *pListTail    
              

    • Bucket双向链表的最后一元素
    •     

        

  14.     

  15. Bucket **arBuckets    
              

    • 一个Bucket指针数组,其大小就是nTableSize决定的,初始化hash表时,数组元素都为空
    •     

        

  16.     

  17. dtor_func_t pDestructor    
              

    • 函数指针,在HashTable的增加、修改、删除Bucket时自动调用,用于处理相关数据的清理工作
    •     

        

  18.     

  19. zend_bool persistent    
              

    • 指出了Bucket内存分配的方式。如果persisient为TRUE,则使用操作系统本身的内存分配函数为Bucket分配内存,否则使用PHP的内存分配函数。
    •     

        

  20.     

  21. unsigned char nApplyCount    
              

    • nApplyCount与bApplyProtection结合提供了一个防止在遍历HashTable时进入递归循环时的一种机制
    •     

        

  22.     

  23. zend_bool bApplyProtection    
              

    • ???
    •     

        

留下评论

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

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据