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 相关文章推荐
定制404错误页面,并发信给管理员的程序
Oct 09 PHP
DW中链接mysql数据库时,建立字符集中文出现乱码的解决方法
Mar 27 PHP
解析php中die(),exit(),return的区别
Jun 20 PHP
php读取csv实现csv文件下载功能
Dec 18 PHP
php cli换行示例
Apr 22 PHP
ThinkPHP里用U方法调用js文件实例
Jun 18 PHP
PHP 7的一些引人注目的新特性简单介绍
Nov 08 PHP
Yii2中SqlDataProvider用法示例
Sep 22 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
Jan 07 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
Mar 19 PHP
Laravel实现通过blade模板引擎渲染视图
Oct 25 PHP
Laravel框架源码解析之入口文件原理分析
May 14 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
收音机史话 - 1960年代前后的DIY
2021/03/02 无线电
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
PHP实现邮件群发的源码
2013/06/18 PHP
php实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
jquery 使用点滴函数代码
2011/05/20 Javascript
使用jquery实现简单的ajax
2013/07/08 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
2013/11/19 Javascript
javascript模拟地球旋转效果代码实例
2013/12/02 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
jQuery插件jFade实现鼠标经过的图片高亮其它变暗
2015/03/14 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
2016/04/17 Javascript
jQuery+HTML5实现弹出创意搜索框层
2016/12/29 Javascript
最实用的JS数组函数整理
2017/12/05 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
ant design实现圈选功能
2019/12/17 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
[00:15]TI9地铁玩家打卡
2019/08/11 DOTA
Python random模块常用方法
2014/11/03 Python
Python 打印中文字符的三种方法
2018/08/14 Python
Python实现八皇后问题示例代码
2018/12/09 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
深入浅析python 协程与go协程的区别
2019/05/09 Python
Django对models里的objects的使用详解
2019/08/17 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
2019/08/20 Python
Python列表元素常见操作简单示例
2019/10/25 Python
保险公司年会主持词
2014/03/22 职场文书
2014最新党员批评与自我批评材料
2014/09/24 职场文书
感谢信怎么写
2015/01/21 职场文书
小班教师个人总结
2015/02/05 职场文书
资料员岗位职责范本
2015/04/13 职场文书
在人间读书笔记
2015/06/30 职场文书
python基础之爬虫入门
2021/05/10 Python