一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - php中hashtable實(shí)現(xiàn)示例分享

php中hashtable實(shí)現(xiàn)示例分享

2020-06-09 16:02PHP開發(fā)網(wǎng) PHP教程

對(duì)php內(nèi)核有一定了解的人應(yīng)該都知道php的精髓就是HashTable,這篇文章主要介紹了php中hashtable實(shí)現(xiàn)示例,需要的朋友可以參考下

對(duì)php內(nèi)核有一定了解的人應(yīng)該都知道php的精髓就是HashTable,HashTable在php的實(shí)現(xiàn)中無處不在。包括php的數(shù)組、什么全局變量、局部變量的作用域等等,php的hashtable拆開來說就是四部分:

hash函數(shù):用的是time33的散列函數(shù),將一個(gè)字符串的key轉(zhuǎn)換成一個(gè)數(shù)字
一個(gè)C數(shù)組:用來儲(chǔ)存桶(buckets)的
兩個(gè)雙向的鏈表:第一個(gè)雙向鏈表是數(shù)組的每個(gè)元素(桶bucket)是一個(gè)雙向鏈表,這樣做是為了解決hash沖突;第二個(gè)雙向鏈表是數(shù)組將每一個(gè)桶(bucket)連接起來,這里要連接的也就是第一個(gè)雙向鏈表的鏈表頭,這樣做是為了遍歷整個(gè)hash表用的,鳥哥有篇blog是講php的foreach的,這里這樣設(shè)計(jì)就是給foreach用的==>《深入理解PHP之?dāng)?shù)組(遍歷順序)》
我這里不再說hashtable的struct和bucket的struct了,因?yàn)橄旅娴耐扑]鏈接幾乎都講了,我不覺得我能描述和說的比他們好,每個(gè)人的水平不一樣,我就以我現(xiàn)在的技術(shù)水平來描述,所以我就只把我整理的一些東西記錄一下

下面是php中hash實(shí)現(xiàn)的兩個(gè)文件:zend_hash.c zend_hash.h。這兩個(gè)文件里面實(shí)現(xiàn)了一堆的api,也引申出了一堆的api,下面是實(shí)現(xiàn)出來的api的原型

 

復(fù)制代碼 代碼如下:

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)  

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 石原莉奈被店长侵犯免费 | 国产一区二区三区水野朝阳 | 国产免费不卡视频 | 日本h片在线 | 国产不卡视频一区二区在线观看 | 黄网久久| 成人私人影院在线版 | 免费在线观看网址大全 | 舔大逼| 欧美一级级a在线观看 | ai换脸杨颖被啪在线观看 | 国产精品亚洲一区二区 | 天天操天天干天天做 | a级免费在线观看 | 都市后宫小说 | 特级毛片免费观看视频 | 深夜福利一区 | 色先锋影音先锋 | 久久全国免费久久青青小草 | 国产在线精品成人一区二区三区 | 亚洲国产在线午夜视频无 | 欧美视频一二三区 | 国产精品人人视频 | 99视频免费在线 | 国产成人看片免费视频观看 | 成人日批视频 | 日韩精品首页 | 欧亚专线欧洲m码可遇不可求 | 日本公与妇中文在线 | 午夜影院c绿象 | 91精品国产综合久久 | 亚洲国产99999在线精品一区 | 激情自拍网 | 四虎1515h永久 | 国产成人精品一区二区不卡 | 欧式午夜理伦三级在线观看 | 亚洲精品国产成人7777 | 国产精品久久久久久久久99热 | 成年人免费观看视频网站 | bl双性受乖调教改造身体 | gogort99人体专业网站 |