php中hashtable实现示例分享


Posted in PHP onFebruary 13, 2014

对php内核有一定了解的人应该都知道php的精髓就是HashTable,HashTable在php的实现中无处不在。包括php的数组、什么全局变量、局部变量的作用域等等,php的hashtable拆开来说就是四部分:

hash函数:用的是time33的散列函数,将一个字符串的key转换成一个数字
一个C数组:用来储存桶(buckets)的
两个双向的链表:第一个双向链表是数组的每个元素(桶bucket)是一个双向链表,这样做是为了解决hash冲突;第二个双向链表是数组将每一个桶(bucket)连接起来,这里要连接的也就是第一个双向链表的链表头,这样做是为了遍历整个hash表用的,鸟哥有篇blog是讲php的foreach的,这里这样设计就是给foreach用的==>《深入理解PHP之数组(遍历顺序)》
我这里不再说hashtable的struct和bucket的struct了,因为下面的推荐链接几乎都讲了,我不觉得我能描述和说的比他们好,每个人的水平不一样,我就以我现在的技术水平来描述,所以我就只把我整理的一些东西记录一下

下面是php中hash实现的两个文件:zend_hash.c zend_hash.h。这两个文件里面实现了一堆的api,也引申出了一堆的api,下面是实现出来的api的原型

ZEND_API ulong zend_hash_func(const char *arKey, uint nKeyLength) 
ZEND_API ulong zend_get_hash_value(const char *arKey, uint nKeyLength) 
ZEND_API int _zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC)
 ZEND_API void zend_hash_set_apply_protection(HashTable *ht, zend_bool bApplyProtection)
ZEND_API int _zend_hash_add_or_update(HashTable *ht, const char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC)
ZEND_API int _zend_hash_quick_add_or_update(HashTable *ht, const char *arKey, uint nKeyLength, ulong h, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC)
ZEND_API int _zend_hash_index_update_or_next_insert(HashTable *ht, ulong h, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC)
ZEND_API int zend_hash_rehash(HashTable *ht)
static int zend_hash_do_resize(HashTable *ht)
ZEND_API int zend_hash_del_key_or_index(HashTable *ht, const char *arKey, uint nKeyLength, ulong h, int flag)
ZEND_API void zend_hash_destroy(HashTable *ht)
ZEND_API void zend_hash_clean(HashTable *ht)
static Bucket *zend_hash_apply_deleter(HashTable *ht, Bucket *p)
ZEND_API void zend_hash_graceful_destroy(HashTable *ht)
ZEND_API void zend_hash_graceful_reverse_destroy(HashTable *ht)
ZEND_API void zend_hash_apply(HashTable *ht, apply_func_t apply_func TSRMLS_DC)
ZEND_API void zend_hash_apply_with_argument(HashTable *ht, apply_func_arg_t apply_func, void *argument TSRMLS_DC)
ZEND_API void zend_hash_apply_with_arguments(HashTable *ht TSRMLS_DC, apply_func_args_t apply_func, int num_args, …)
ZEND_API void zend_hash_reverse_apply(HashTable *ht, apply_func_t apply_func TSRMLS_DC)
ZEND_API void zend_hash_copy(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, void *tmp, uint size)
ZEND_API void _zend_hash_merge(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, void *tmp, uint size, int overwrite ZEND_FILE_LINE_DC)
static zend_bool zend_hash_replace_checker_wrapper(HashTable *target, void *source_data, Bucket *p, void *pParam, merge_checker_func_t merge_checker_func)
ZEND_API void zend_hash_merge_ex(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, uint size, merge_checker_func_t pMergeSource, void *pParam)    
ZEND_API int zend_hash_find(const HashTable *ht, const char *arKey, uint nKeyLength, void **pData)
ZEND_API int zend_hash_quick_find(const HashTable *ht, const char *arKey, uint nKeyLength, ulong h, void **pData)
ZEND_API int zend_hash_exists(const HashTable *ht, const char *arKey, uint nKeyLength)
ZEND_API int zend_hash_quick_exists(const HashTable *ht, const char *arKey, uint nKeyLength, ulong h)
ZEND_API int zend_hash_index_find(const HashTable *ht, ulong h, void **pData)
ZEND_API int zend_hash_index_exists(const HashTable *ht, ulong h) 
ZEND_API int zend_hash_num_elements(const HashTable *ht)
ZEND_API int zend_hash_get_pointer(const HashTable *ht, HashPointer *ptr)
ZEND_API int zend_hash_set_pointer(HashTable *ht, const HashPointer *ptr)
ZEND_API void zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos)
ZEND_API void zend_hash_internal_pointer_end_ex(HashTable *ht, HashPosition *pos)
ZEND_API int zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos)
ZEND_API int zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos)
ZEND_API int zend_hash_get_current_key_ex(const HashTable *ht, char **str_index, uint *str_length, ulong *num_index, zend_bool duplicate, HashPosition *pos)
ZEND_API int zend_hash_get_current_key_type_ex(HashTable *ht, HashPosition *pos)
ZEND_API int zend_hash_get_current_data_ex(HashTable *ht, void **pData, HashPosition *pos)
ZEND_API int zend_hash_update_current_key_ex(HashTable *ht, int key_type, const char *str_index, uint str_length, ulong num_index, int mode, HashPosition *pos)
ZEND_API int zend_hash_sort(HashTable *ht, sort_func_t sort_func, compare_func_t compar, int renumber TSRMLS_DC) 
ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, zend_bool ordered TSRMLS_DC)
ZEND_API int zend_hash_minmax(const HashTable *ht, compare_func_t compar, int flag, void **pData TSRMLS_DC)
ZEND_API ulong zend_hash_next_free_element(const HashTable *ht)
void zend_hash_display_pListTail(const HashTable *ht)
void zend_hash_display(const HashTable *ht)  
PHP 相关文章推荐
提升PHP执行速度全攻略(下)
Oct 09 PHP
PHP EOT定界符的使用详解
Sep 30 PHP
php将会员数据导入到ucenter的代码
Jul 18 PHP
php下保存远程图片到本地的办法
Aug 08 PHP
php中长文章分页显示实现代码
Sep 29 PHP
基于php实现七牛抓取远程图片
Dec 01 PHP
php实现异步数据调用的方法
Dec 24 PHP
php生出随机字符串
Jul 06 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
PHP实现一维数组与二维数组去重功能示例
May 24 PHP
Yii使用DbTarget实现日志功能的示例代码
Jul 21 PHP
php redis setnx分布式锁简单原理解析
Oct 23 PHP
php实现下载限制速度示例分享
Feb 13 #PHP
php解压文件代码实现php在线解压
Feb 13 #PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
Feb 13 #PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
Feb 13 #PHP
使用swoole扩展php websocket示例
Feb 13 #PHP
php实现图片添加水印功能
Feb 13 #PHP
php教程之phpize使用方法
Feb 12 #PHP
You might like
PHP+MySQL5.0中文乱码解决方法
2006/11/20 PHP
PHP递归调用的小技巧讲解
2013/02/19 PHP
PHP获取中英混合字符串长度的方法
2014/06/07 PHP
利用PHP函数计算中英文字符串长度的方法
2014/11/11 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
js no-repeat写法 背景不重复
2009/03/18 Javascript
学习ExtJS Panel常用方法
2009/10/07 Javascript
浅析JS刷新框架中的其他页面 && JS刷新窗口方法汇总
2013/07/08 Javascript
JavaScript bold方法入门实例(把指定文字显示为粗体)
2014/10/17 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
浅谈javascript中new操作符的原理
2016/06/07 Javascript
jQuery扩展+xml实现表单验证功能的方法
2016/12/25 Javascript
jQuery操作之效果详解
2017/05/19 jQuery
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
JS简单生成由字母数字组合随机字符串示例
2018/05/25 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
Moment.js实现多个同时倒计时
2019/08/26 Javascript
原生JS实现留言板
2020/03/26 Javascript
如何使用 vue-cli 创建模板项目
2020/11/19 Vue.js
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
利用Python批量提取Win10锁屏壁纸实战教程
2018/03/27 Python
python list是否包含另一个list所有元素的实例
2018/05/04 Python
Python常用数据类型之间的转换总结
2019/09/06 Python
pytorch 实现cross entropy损失函数计算方式
2020/01/02 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
Python项目跨域问题解决方案
2020/06/22 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
应届生煤化工求职信
2013/10/21 职场文书
政府信息公开实施方案
2014/05/09 职场文书
美容院合作经营协议书
2014/10/10 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
2015年主婚人婚礼致辞
2015/07/28 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android