|=-----------------------------------------------------------------------=| |=---------------------=[ index 2.哈希表的实现:结构体 bucket和_hashtable组成了完整的HashTable。 首先看bucket结构体(定义在 Zend/zend_hash.h): typedef struct bucket { ulong h; /*hash值*/ uint nKeyLength;/*key的长度*/ void *pData;/*要保存的内存块地址,通常是malloc来的地址*/ void *pDataPtr;/*保存指针数据,不经过malloc的指针,防止产生内存碎片*/ struct bucket *pListNext; /*bucket中具有同一hash值的下一个元素*/ struct bucket *pListLast; /*bucket中具有同一hash值的上一个元素*/ struct bucket *pNext;/*双向链表的下一个元素*/ struct bucket *pLast; /*双向链表的上一个元素*/ const char *arKey;/*保存key*/ } Bucket; 可以看出bucket是一个双向链表,这是为了解决多个key冲突的问题(即算法导论中的链接法) 再看_hashtable结构体: typedef struct _hashtable { uint nTableSize; /*bucket数组的大小*/ uint nTableMask; uint nNumOfElements;/*HashTable中元素的个数*/ ulong nNextFreeElement;/*下一个可用的Bucket位置*/ Bucket *pInternalPointer/*遍历HashTable元素*/ Bucket *pListHead;/*双向链表表头*/ Bucket *pListTail;/*双向链表表尾*/ Bucket **arBuckets;/*Bucket数组*/ } HashTable; ======== 此处为HashTable的结构图 ======== 3.神奇的数字--33 见我原来的一篇博客:http://blog.csdn.net/wusuopubupt/article/details/11479869 下面是 =========== 此处涉及编译原理知识,需补充。 =========== ///// 0x04 参考文献 ///// TIPI: http://www.php-internals.com/book/?p=chapt03/03-00-variable-and-data-types 登录后复制 09-08 06:42