初始化的主要工作是为哈希表申请存储空间,函数中使用calloc函数的目的是确保
数据存储的槽为都初始化为0,以便后续在插入和查找时确认该槽为是否被占用。int hash_insert(HashTable *ht, char *key, void *value)
{// check if we need to resize the hashtableresize_hash_table_if_needed(ht);int index = HASH_INDEX(ht, key);Bucket *org_bucket = ht->buckets[index];Bucket *tmp_bucket = org_bucket;// check if the key exits alreadywhile(tmp_bucket){if(strcmp(key, tmp_bucket->key) == 0){LOG_MSG("[update]\tkey: %s\n", key);tmp_bucket->value = value;return SUCCESS;}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){LOG_MSG("[collision]\tindex:%d key:%s\n", index, key);bucket->next = org_bucket;}ht->buckets[index]= bucket;LOG_MSG("[insert]\tindex:%d key:%s\tht(num:%d)\n",index, key, ht->elem_num);return SUCCESS;
}

static void resize_hash_table_if_needed(HashTable *ht)
{if(ht->size - ht->elem_num < 1){hash_resize(ht);}
}static int hash_resize(HashTable *ht)
{// double the sizeint 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[i];Bucket *tmp;while(cur){// rehash: insert againhash_insert(ht, cur->key, cur->value);// free the org bucket, but not the elementtmp = cur;cur = cur->next;free(tmp);}}free(org_buckets);LOG_MSG("[resize] done\n");return SUCCESS;
}

PHP中数组是基于哈希表实现的,依次给数组添加元素时,元素之间是有先后顺序的, 而这里的哈希表在物理位置上显然是接近平均分布的,这样是无法根据插入的先后顺序获取到这些元素的, 在PHP的实现中Bucket结构体还维护了另一个指针字段来维护元素之间的关系。 具体内容在后一小节PHP中的HashTable中进行详细说明。上面的例子就是PHP中实现的一个精简版。本小节的HashTable实例完整代码可以在$TIPI_ROOT/book/sample/chapt03/03-01-01-hashtable目录中找到。 或者在github上浏览: https://github.com/reeze/tipi/tree/master/book/sample/chapt03/03-01-01-hashtable


http://www.php-internals.com/book/?p=chapt03/03-01-01-hashtable

22.哈希表(HashTable)相关推荐

  1. C#中哈希表(HashTable)的用法详解

    1.  哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对, ...

  2. 在C#中应用哈希表(Hashtable)

    一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其 ...

  3. 哈希表(hashtable)的javascript简单实现

    javascript中没有像c#,java那样的哈希表(hashtable)的实现.在js中,object属性的实现就是hash表,因此只要在object上封装点方法,简单的使用obejct管理属性的 ...

  4. 哈希表 Hashtable c# 1613537346

    哈希表 Hashtable c# 1613537346 使用命名空间 using System.Collections; 实例化得到对象 Hashtable 对象 = new Hashtable(); ...

  5. hash table html,javascript 哈希表(hashtable)的简单实现

    首先简单的介绍关于属性的一些方法: 属性的枚举: for/in循环是遍历对象属性的方法.如 var obj = { name : 'obj1', age : 20, height : '176cm' ...

  6. 哈希表 HashTable对象 c#

    导入命名空间 using System.Collections; 生成哈希表对象 Hashtable ht = new Hashtable(); ht是变量名 哈希表特点 以键值对形式存值 模型是驿站 ...

  7. OpenAirInterface中的哈希表hashtable实现

    目录 项目名称 源代码 hashtable.h.obj_hashtable.h hashtable.c.obj_hashtable.c demos 项目名称 OpenAirInterface 源代码 ...

  8. Python数据结构实战——哈希表(HashTable)

    文章目录 1.定义哈希转换函数 2.定义哈希表类 2.1.不使用__setitem__ 2.2.使用__setitem__ 1.定义哈希转换函数 def get_hash(key):hash = 0f ...

  9. 哈希表 HashTable

    (1)哈希表底层存储结构也是线性表 (2)哈希表的核心在于哈希函数,哈希函数用于获取index值,决定了将元素放在哪个位置 (3)hash表的增删查时间复杂度都是O(1) 可以根据hash函数直接定位 ...

  10. 【数据结构】 哈希表 详解

    目录 1. 概念 引入 2. 冲突 2.1 概念 2.2 避免 2.3 冲突-避免-哈希函数设计 2.4 冲突-避免-负载因子调节(重点) 2.5 冲突-解决 2.5.1 闭散列 2.6 冲突-解决- ...

最新文章

  1. GDC服务器主机与证书不匹配,调用web服务soap时,错误https URL主机名与客户端信任库中服务器证书上的公用名(CN)不匹配...
  2. Spring Security 实战:基于配置的接口角色访问控制
  3. python3.7 6如何安装-Python 3.7.1在CentOS 6.10 安装部署
  4. jQuery Mobile数据属性
  5. 操作电脑小心“伤”手
  6. keyloadtool_phoenix 利用CsvBulkLoadTool 批量带入数据并自动创建索引
  7. oracle中如何加字母,Oracle数据库之oracle数据库表插入数据的时候如何产生一个字母+数字...
  8. xp桌面计算机隐藏设置方法,匿于无形 WindowsXP系统隐藏技巧大放送
  9. 单片机 多机通讯c语言,【C语言】89c52单片机的多机串口通讯,救助
  10. ACM32 MCU元器件AD封装库
  11. 一文学会「内存映射」
  12. win11官网的预览版系统如何下载安装
  13. 在 Google 工作 10 年,到底能学到啥?
  14. 压缩文件已损坏怎么办?恢复压缩文件,解决方法看这里
  15. android 图片浏览 app 排行版,安卓图片浏览软件哪个好_安卓图片浏览app推荐_图片浏览app软件排行...
  16. converting character set: invalid arguements
  17. 中小学数学试卷自动生成程序-对张凯翔同学代码的评价
  18. 云服务器如何修改操作系统,云服务器如何修改操作系统
  19. 华为一碰传nfc标签_NFC标签?NFC碰碰贴?NFC一碰传?只要6块钱4个,嘿嘿~
  20. 小罗与卡卡辞别世界杯

热门文章

  1. 蜗牛—Android基础之button监听器
  2. vector的基础使用
  3. Gradle在Android中的基本使用
  4. Hadoop可视化与交互式工具:Zeppelin和Hue
  5. 《Flash ActionScript 3.0 动画高级教程》
  6. ASP.NET理论知识及面试题
  7. Android KLog源代码分析
  8. Gulp介绍与入门实践
  9. 插入排序---直接插入排序算法(Javascript版)
  10. 这周我加星(8-11)