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 在文件指定行插入数据的代码
May 08 PHP
PHP实现生成透明背景的PNG缩略图函数分享
Jul 08 PHP
PHP实现的带超时功能get_headers函数
Feb 10 PHP
PHP判断网络文件是否存在的方法
Mar 12 PHP
php中的异常和错误浅析
May 03 PHP
Django 标签筛选的实现代码(一对多、多对多)
Sep 05 PHP
PHP实现微信对账单处理
Oct 01 PHP
PHP7 mongoDB扩展使用的方法分享
May 02 PHP
PHP判断一个变量是否为整数、正整数的方法示例
Sep 11 PHP
使用laravel的migrate创建数据表的方法
Sep 30 PHP
Laravel 框架路由原理与路由访问实例分析
Apr 14 PHP
PHP获取类私有属性的3种方法
Sep 10 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
在IIS7.0下面配置PHP 5.3.2运行环境的方法
2010/04/13 PHP
PHP生成器简单实例
2015/05/13 PHP
PHP实现简易计算器功能
2020/08/28 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
JavaScript格式化数字的函数代码
2010/11/30 Javascript
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
js中设置元素class的三种方法小结
2011/08/28 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
2016/02/29 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
2017/02/16 Javascript
js实现3D图片环展示效果
2017/03/09 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
jQuery实现的淡入淡出与滑入滑出效果示例
2018/04/18 jQuery
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
QRCode.js二维码生成并能长按识别
2018/10/16 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
微信小程序实现选项卡效果
2018/11/06 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
Vue 事件处理操作实例详解
2019/03/05 Javascript
vue cli安装使用less的教程详解
2019/07/12 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
javascript+css实现俄罗斯方块小游戏
2020/06/28 Javascript
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
线程和进程的区别及Python代码实例
2015/02/04 Python
python非递归全排列实现方法
2017/04/10 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
如何利用python web框架做文件流下载的实现示例
2020/06/02 Python
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
中秋客户感谢信
2015/01/22 职场文书
教你用Python matplotlib库制作简单的动画
2021/06/11 Python
Java8中接口的新特性使用指南
2021/11/01 Java/Android