OpenRtsp源码剖析之hashtable解析
来源:互联网 发布:网络电视剧十大排行榜 编辑:程序博客网 时间:2024/06/05 16:06
OpenRtsp源码剖析:hashtable
这是主要保存数据value和key的结构体:
class TableEntry { public: TableEntry* fNext; char const* key; void* value; };
这是操作hashtable的类,里面包括一系列操作函数,下面只列出主要的数据成员:
TableEntry** fBuckets; // pointer to bucket array TableEntry* fStaticBuckets[SMALL_HASH_TABLE_SIZE];// used for small tables unsigned fNumBuckets; //桶的个数,初始化时等于SMALL_HASH_TABLE_SIZE unsigned fNumEntries; //数据entry的个数 unsigned fRebuildSize; //当fNumEntries的个数大于等于它时就要重建rebuild,初始化时等于3*SMALL_HASH_TABLE_SIZE int fKeyType; //key的类型
下面具体介绍几个主要的操作:
主要的设计模型:
添加成员部分源代码:
void* BasicHashTable::Add(char const* key, void* value) { void* oldValue; unsigned index; TableEntry* entry = lookupKey(key, index); if (entry != NULL) { // There's already an item with this key oldValue = entry->value; } else { // There's no existing entry; create a new one: entry = insertNewEntry(index, key); oldValue = NULL; } entry->value = value; // If the table has become too large, rebuild it with more buckets: if (fNumEntries >= fRebuildSize) rebuild(); return oldValue; }
对应的图:
当添加到一定数量的时候重建:
部分源代码:
void BasicHashTable::rebuild() { // Remember the existing table size: unsigned oldSize = fNumBuckets; TableEntry** oldBuckets = fBuckets; // Create the new sized table: fNumBuckets *= 4; fBuckets = new TableEntry*[fNumBuckets]; for (unsigned i = 0; i < fNumBuckets; ++i) { fBuckets[i] = NULL; } fRebuildSize *= 4; fDownShift -= 2; fMask = (fMask<<2)|0x3; // Rehash the existing entries into the new table: for (TableEntry** oldChainPtr = oldBuckets; oldSize > 0; --oldSize, ++oldChainPtr) { for (TableEntry* hPtr = *oldChainPtr; hPtr != NULL; hPtr = *oldChainPtr) { *oldChainPtr = hPtr->fNext; unsigned index = hashIndexFromKey(hPtr->key); hPtr->fNext = fBuckets[index]; fBuckets[index] = hPtr; } } // Free the old bucket array, if it was dynamically allocated: if (oldBuckets != fStaticBuckets) delete[] oldBuckets; }
重建图 模型:
- OpenRtsp源码剖析之hashtable解析
- STL之hashtable源码剖析
- 《STL源码剖析》之hashtable
- Java8集合源码解析-Hashtable源码剖析
- JDK之HashTable源码解析
- 深入集合框架之Hashtable源码剖析
- 【源码】Hashtable源码剖析
- 【源码】Hashtable源码剖析
- HashTable源码剖析
- Hashtable源码剖析
- C# Hashtable源码剖析
- HashTable源码剖析
- Hashtable源码剖析
- Java HashTable 源码剖析
- Java集合之Hashtable源码解析
- 【Java集合源码剖析】Hashtable源码剖析
- 【Java集合源码剖析】Hashtable源码剖析
- 【Java集合源码剖析】Hashtable源码剖析
- 使用 Apache MINA 2 开发网络应用
- 我在Salira的800天(2009.5.20~2011.7.29)-二.工作篇
- windows 写读注册表 示例
- HttpsURLConnection 安全传输(HTTPS--Secure Hypertext Transfer Protocol-安全超文本传输协议)
- Android腾讯微薄客户端开发六:给用户加VIP认证以及美化微博显示内容
- OpenRtsp源码剖析之hashtable解析
- java swing 组件大全----测试Swing所有组件及其相应的事件
- static_cast和reinterpret_cast
- 玩转Android---UI篇---ZoomControls放大缩小图片
- wav文件格式分析详解
- JSP、Struts2下载中文文件名乱码问题
- asp.net三层架构详解
- The Django Book 网址
- 刪除 sendmail 的mail queue中信件