PHP核心中的HashTable

2021-07-25 13:03:43 字數 1643 閱讀 6013

本文和大家分享的主要是php核心的hashtable相關使用,希望通過本文的分享,對大家學習php有所幫助。

typedef struct _bucket

bucket;

typedef struct _hashtable

hashtable;

這個是乙個簡化過的雜湊表結構

bucket是乙個鍊錶,而_hashtable用於儲存hash值並指向真正的資料儲存單位

解決衝突演算法djbx33a

而鍊錶是為了解決衝突用的,衝突解決採用djbx33a演算法,演算法的內容如下

inlineunsignedtime33(charconst*str,intlen)

switch (len)

return hash;

}hashtable的初始化

初始化,申請空間並且設定初始化值

inthash_init(hashtable *ht)

hashtable的插入

插入函式,插入時驗證key是否存在,存在更新value值,不存在並取發生衝突則建立新節點並插入到原有鍊錶的頭部

inthash_insert(hashtable *ht,char*key,void*value)

tmp_bucket = tmp_bucket->next;

}bucket *bucket = (bucket *)malloc(sizeof(bucket));

bucket->key = key;

bucket->value = value;

bucket->next = null;

ht->elem_num += 1;

if(org_bucket != null)

ht->buckets[index]= bucket;

log_msg("[insert]\tindex:%d key:%s\tht(num:%d)\n",

index, key, ht->elem_num);

return success;

}hashtable的擴容

當hash表容量滿了的時候,hash表的效能會下降,這時候需要對hash表進行擴容

先把原來hash表容量變成兩倍,然後對其進行重新插入操作,時間複雜度為o(n)

staticvoidresize_hash_table_if_needed(hashtable *ht)

}staticinthash_resize(hashtable *ht)

{// double the size

int org_size = ht->size;

ht->size = ht->size * 2;

ht->elem_num = 0;

log_msg("[resize]\torg size: %i\tnew size: %i\n", org_size, ht->size);

bucket **buckets = (bucket **)calloc(ht->size, sizeof(bucket *));

bucket **org_buckets = ht->buckets;

ht->buckets = buckets;

int i = 0;

for(i=0; i < org_size; ++i)

{bucket *cur = org_buckets

php核心中的變數

php是弱型別語言,它可以儲存任何的資料型別。但是php是使用c語言編寫的,而c語言是強型別語言。每個變數都有固定的型別,不能隨意改變變數的型別。在zend zend.h中,檢視結構體 zval結構體就是通常用到的php變數在核心總的表示形式,在zval結構體中,可以看到四個成員變數,分別是 zva...

PHP核心中的神器之HashTable

分類 c c php 2013 04 25 17 23 7137人閱讀收藏 舉報目錄 雜湊表 或雜湊表 是將鍵名key按指定的雜湊函式hash經過hash key 計算後對映到表中乙個記錄,而這個陣列就是雜湊表。這裡的hash指任意的函式,例如md5 crc32 sha1或你自定義的函式實現。has...

PHP變數在核心中的實現

我們都知道php是乙個弱型別語言,它的變數理論上可以儲存任何型別的資料。那麼,php的變數在核心中究竟是怎麼實現的呢?在php核心中,變數稱為zval,變數的值稱為zend value,注意這是兩個不同的東西。php中變數的記憶體是通過引用計數的方式進行管理的,在php7之前,zval容器中有兩個位...