php中hashtable实现示例分享

 对php内核有一定了解的人应该都知道php的精髓就是HashTable,这篇文章主要介绍了php中hashtable实现示例,需要的朋友可以参考下

对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)   

时间: 2024-09-26 10:38:36

php中hashtable实现示例分享的相关文章

树形结构的3中搜索方式示例分享_C 语言

复制代码 代码如下: /**树的3中常见搜索方式1.二叉树方式(每一层只有0和1)2.满m叉树(每一层都有0 到m - 1)3.子集树,也称为全排列树*/#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <string> using namespace std; const int M = 20; int n, m;int ans[

java去除集合中重复元素示例分享 java去除重复_java

复制代码 代码如下: class ArrayListTest1 {    public static void main(String[] args) {        ArrayList al = new ArrayList();        al.add("java03");        al.add("java03");        al.add("java01");        al.add("java02")

asp.net发送邮件示例分享

 这篇文章主要介绍了asp.net发送邮件示例分享,需要的朋友可以参考下 mailhelper  -------mail帮助类    代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mail;   /// <summary> ///mailhelper 的摘要说明 /// </summary> public clas

PHP场景中getshell防御思路分享

1 背景概述WEB应用漏洞导致的入侵时有发生,扫描器和WAF并不能解决所 有的问题,于是尝试在主机侧针对PHP环境做了一个防御方案.很荣幸的邀请到TSRC部分白帽子做了一次对抗演习,本文主要分享一下防御思路.防御方案主要想解决的问题是getshell.主机敏感文件泄漏等问题.于是乎出了下面这样一个题目:部署了防御方案的Nginx + PHP 的WEB环境,提供一个上传入口,可上传任意文件.找到WEB目录下的一个flag文件读取到内容即算突破.2 PHP扩展防御方案使用了PHP扩展来完成阻断.PH

Yii2中SqlDataProvider用法示例_php实例

本文实例讲述了Yii2中SqlDataProvider用法.分享给大家供大家参考,具体如下: 第一种方法: $totalCount = Yii::$app->db->createCommand('SELECT COUNT(*) FROM posts WHERE publish=:publish', [':publish' => 1]) ->queryScalar(); $dataProvider = new SqlDataProvider([ 'sql' => 'SELECT

Android中BaseAdapter用法示例_Android

本文实例讲述了Android中BaseAdapter用法.分享给大家供大家参考,具体如下: 概述: BaseAdapter就Android应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像ListView.Spinner.Gallery及GridView等UI显示组件,它是继承自接口类Adapter BaseAdapter Java代码: public class RecentAdapter extends BaseAdapter { private class RecentVi

JavaScript中return用法示例_javascript技巧

本文实例讲述了JavaScript中return用法.分享给大家供大家参考,具体如下: return可以接受函数中的返回值,前提是函数中要有return语句. 下面是一个应用小示例: <html> <head> <script type='text/javascript'> function linkPage(){ alert('You Clicked??'); return false; } </script> </head> <body

Yii2中cookie用法示例分析_php实例

本文实例讲述了Yii2中cookie用法.分享给大家供大家参考,具体如下: <?php //设置方法 $cookie = new Cookie([ 'name' => 'cookie_monster', 'value' => 'Me want cookie!', 'expire' => time() + 86400 * 365, ]); \Yii::$app->getResponse()->getCookies()->add($cookie); //读取方法 $v

Android中BaseAdapter用法示例

本文实例讲述了Android中BaseAdapter用法.分享给大家供大家参考,具体如下: 概述: BaseAdapter就Android应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像ListView.Spinner.Gallery及GridView等UI显示组件,它是继承自接口类Adapter BaseAdapter Java代码: public class RecentAdapter extends BaseAdapter { private class RecentVi