PHP カーネルをある程度理解している人なら誰でも、PHP の本質は HashTable であり、HashTable は PHP の実装のいたるところに存在することを知っているはずです。 PHP 配列、グローバル変数、ローカル変数のスコープなどを含む、PHP ハッシュテーブルは 4 つの部分に分類できます:
ハッシュ関数: time33 ハッシュ関数を使用して文字列のキーを数値に変換します
A C 配列: バケットの保存に使用されます
2 つの双方向リンク リスト: 最初の双方向リンク リストは配列です の各要素 (バケット) は二重ですリンクされたリストは、ハッシュの競合を解決するために行われます。2 番目の二重リンク リストは、各バケット (バケット) を接続する配列であり、ここで接続されるのは最初の二重リンク リストです。ハッシュテーブル全体を走査します。Niao 兄弟が PHP の foreach についてブログを書いています。ここでの設計は foreach ==> 「PHP における配列の詳細な理解 (走査順序)」です
ハッシュテーブルの構造体とバケットについては説明しません。ほとんどすべてが以下の推奨リンクに記載されているので、これ以上説明することはできないと思います。私は現在の技術レベルを使用します。私がまとめたもののいくつかを記録します
以下は、php でのハッシュ実装用の 2 つのファイルです: zend_hash.c zend_hash.h。これら 2 つのファイルは、一連の 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, d tor_func_t pDestructor、zend_bool 永続 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)
Z END_API int _zend_hash_quick_add_or_update(ハッシュテーブル*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, h, int フラグ)
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, u int 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,位置 *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重複, HashPosition *正)
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_タイプ、const char *str_index、uint str_length、 ulong num_index, int モード, 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,比較、zend_bool で順序付けされた 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)
http://www.bkjia.com/PHPjc/735244.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/735244.html技術記事 PHP カーネルをある程度理解している人なら、PHP の本質は HashTable であり、HashTable は PHP の実装のいたるところに存在することを知っているはずです。 PHP 配列、グローバル変数、ローカル変数の役割を含む...