本文和大家分享的主要是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容器中有兩個位...