主要实现了以整数为关键字的hash,以key%m_nSize为哈希函数,以(hash(key)+i)%m_nSize重新寻址,并附带了elf_hash的实现,使用过程中可灵活修改。
  1. #ifndef _MY_HASH_INT_H_
  2. #define _MY_HASH_INT_H_
  3.  
  4. template<class T,class K>
  5. class HashInt{
  6. public:
  7. HashInt();
  8. virtual ~HashInt();
  9. private:
  10. typedef struct tagElement
  11. {
  12. T data;
  13. K key;
  14. bool use;
  15. tagElement(){use = false;}
  16. ~tagElement(){}
  17. }Element;
  18. unsigned int m_nSize;
  19. Element *m_arrT;
  20. unsigned int m_nElementCnt;
  21. // 查找
  22. bool find(K key,unsigned int &index);
  23. public:
  24. // 初始化,分配内存
  25. bool init(const unsigned int size);
  26. // 哈希函数
  27. unsigned int hash(K key);
  28. // ELF哈希函数
  29. unsigned int hash_elf(char *str);
  30. // 插入
  31. bool insert(T data,K key);
  32. // 删除
  33. bool remove(K key);
  34. // 查找
  35. bool find(K key,T &data);
  36. // 修改
  37. bool modify(T data,K key);
  38. void dump();
  39. };
  40.  
  41. template<class T,class K>
  42. unsigned int HashInt<T, K>::hash_elf( char *str)
  43. {
  44. unsigned int locate = ;
  45. unsigned int x = ;
  46. while (*str)
  47. {
  48. locate = (locate << ) + (*str++);//hash左移4位,当前字符ASCII存入hash低四位。
  49. if ((x = locate & 0xF0000000L) != )
  50. {//如果最高的四位不为0,则说明字符多余7个,如果不处理,再加第九个字符时,第一个字符会被移出,因此要有如下处理。
  51. locate ^= (x >> );
  52. //清空28-31位。
  53. locate &= ~x;
  54. }
  55. }
  56. return locate%m_nSize;
  57. }
  58.  
  59. template<class T,class K>
  60. HashInt<T, K>::~HashInt()
  61. {
  62. if(m_arrT != NULL)
  63. {
  64. delete[] m_arrT;
  65. }
  66. }
  67.  
  68. template<class T,class K>
  69. HashInt<T, K>::HashInt()
  70. {
  71. m_arrT = NULL;
  72. m_nSize = ;
  73. m_nElementCnt = ;
  74. }
  75.  
  76. template<class T,class K>
  77. void HashInt<T, K>::dump()
  78. {
  79. cout<<"m_nElementCnt="<<m_nElementCnt<<",m_nSize="<<m_nSize<<endl;
  80. for(unsigned int i = ;i < m_nSize;i++)
  81. {
  82. if(m_arrT[i].use == true)
  83. {
  84. cout<<i<<"-";
  85. m_arrT[i].data->display();
  86. }
  87. }
  88. cout<<endl;
  89. }
  90.  
  91. template<class T,class K>
  92. bool HashInt<T, K>::modify( T data,K key )
  93. {
  94. if( m_nElementCnt == )
  95. {
  96. return false;
  97. }
  98. bool exist = false;
  99. unsigned int index;
  100. exist = find(key,index);
  101. if( exist == true )
  102. {
  103. m_arrT[index].data = data;
  104. }
  105. return false;
  106. }
  107.  
  108. template<class T,class K>
  109. bool HashInt<T, K>::find( K key,T &data )
  110. {
  111. if( m_nElementCnt == )
  112. {
  113. return false;
  114. }
  115. bool exist = false;
  116. unsigned int index;
  117. exist = find(key,index);
  118. if( exist == true )
  119. {
  120. data = m_arrT[index].data;
  121. }
  122. return false;
  123. }
  124.  
  125. template<class T,class K>
  126. bool HashInt<T, K>::find( K key,unsigned int &index )
  127. {
  128. if( m_nElementCnt == )
  129. {
  130. return false;
  131. }
  132. unsigned int locate = hash(key),i = ;
  133. while(i < m_nSize)
  134. {
  135. if( m_arrT[locate].use == true && m_arrT[locate].key == key)
  136. {
  137. index = locate;
  138. return true;
  139. }
  140. locate = (locate + i)%m_nSize;
  141. i++;
  142. }
  143. return false;
  144. }
  145.  
  146. template<class T,class K>
  147. bool HashInt<T, K>::remove( K key )
  148. {
  149. // 表为空
  150. if( m_nElementCnt == )
  151. {
  152. return false;
  153. }
  154. bool exist = false;
  155. unsigned int index;
  156. exist = find(key,index);
  157. if( exist == true )
  158. {
  159. m_arrT[index].use = false;
  160. m_nElementCnt--;
  161. return true;
  162. }
  163. return false;
  164. }
  165.  
  166. template<class T,class K>
  167. bool HashInt<T, K>::insert( T data,K key)
  168. {
  169. // 表已满
  170. if( m_nElementCnt == m_nSize )
  171. {
  172. return false;
  173. }
  174. unsigned int locate = hash(key),i = ;
  175. while(i < m_nSize)
  176. {
  177. if( m_arrT[locate].use == false)
  178. {
  179. m_arrT[locate].data = data;
  180. m_arrT[locate].key = key;
  181. m_arrT[locate].use = true;
  182. m_nElementCnt++;
  183. return true;
  184. }
  185. locate = (locate + i)%m_nSize;
  186. i++;
  187. }
  188. return false;
  189. }
  190.  
  191. template<class T,class K>
  192. unsigned int HashInt<T, K>::hash( K key )
  193. {
  194. return key%m_nSize;
  195. }
  196.  
  197. template<class T,class K>
  198. bool HashInt<T, K>::init( const unsigned int size )
  199. {
  200. m_nSize = size;
  201. m_arrT = new Element[m_nSize];
  202. m_nElementCnt = ;
  203. cout<<"size = "<<sizeof(Element)*m_nSize<<endl;
  204. return true;
  205. }
  206.  
  207. #endif

C++ 简单 Hash容器的实现的更多相关文章

  1. 理解与模拟一个简单servlet容器

    servlet接口 使用servlet编程需要实现或者继承实现了javax.servlet.Servlet接口的类,其中定义了5个签名方法: public void init(ServletConfi ...

  2. HDOJ-ACM1425 sort 简单hash应用

    其实快排也可以通过这个问题~不是考点 没想到考点是这个,简单hash应用,空间换时间 初始化一个长度为1000001的数组(由于数字的范围为[-500000,500000]) 如果存在这个数m,数组下 ...

  3. 一个简单servlet容器

    一个简单servlet容器 2.1 javax.servlet.Servlet接口 Servlet编程需要使用javax.servlet和javax.servlet.http两个包下的接口和类 在所有 ...

  4. 【最简单IOC容器实现】实现一个最简单的IOC容器

    前面DebugLZQ的两篇博文: 浅谈IOC--说清楚IOC是什么 IoC Container Benchmark - Performance comparison 在浅谈IOC--说清楚IOC是什么 ...

  5. HDU 1880 简单Hash

    题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=1880] 中文题面,题意很简单: 题解: 把每个 魔咒 和 对应的功能分别Hash,然后分别映射到ma ...

  6. HDU——2112HDU Today(SPFA+简单Hash或map+前向星)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. 简单IOC容器实现

    前言 本文是为了学习Spring IOC容器的执行过程而写,不能完全代表Spring IOC容器,只是简单实现了容器的依赖注入和控制反转功能,无法用于生产,只能说对理解Spring容器能够起到一定的作 ...

  8. 简单Hash函数LongHash

    import java.security.SecureRandom; import java.util.Random; public class LongHash { private static l ...

  9. hdu 4287Intelligent IME(简单hash)

    Intelligent IME Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

随机推荐

  1. 获取枚举类型Description特性的描述信息

    C#中可以对枚举类型用Description特性描述. 如果需要对Description信息获取,那么可以定义一个扩展方法来实现.代码如下: public static class EnumExten ...

  2. ASP.NET RepeatLayout 属性

    定义和用法 RepeatLayout 属性用于设置或获取如何显示在 CheckBoxList 中的项目. 语法 <asp:CheckBoxList RepeatLayout="mode ...

  3. ps插件安装

    CutAndSliceMe.zxp 切图插件安装,下载后改为zip后缀,再解压后 复制文件夹到(PS软件安装目录)PhotoshopCC\Plug-ins\Panels文件夹下面

  4. C# - DataValid数据验证类

    从EasyCode 摘取下来的数据验证类 using System; using System.Collections.Generic; using System.Text; namespace Le ...

  5. Html - Bootstrap 头部

    <div class="container"> <div class="row clearfix"> <div class=&qu ...

  6. HTML第一课总结

    1.图片热点: 规划出图片上的一个区域,可以做出超链接,直接点击图片区域就可以完成跳转的效果. 示例: 2.网页划区: 在一个网页里,规划出一个区域用来展示另一个网页的内容. 示例: 3.网页的拼接: ...

  7. redis 配置 linux

    附件 启动停止脚本 redis_6433: #/bin/sh #Configurations injected by install_server below.... EXEC=/usr/local/ ...

  8. git基础及分支

    关于版本控制 git是一种分布版本控制系统,每一主机都保存了完整副本.必杀技是分支. 在Windows可安装git客户端msysgit. git基础 第一次看progit觉得有点不懂,不懂版本控制,一 ...

  9. ThinkPHP中的三大自动简介

    ThinkPHP中的三大自动简介 文章TAG:thinkphp 自动简介 时间:2014-08-23来源:商业源码网 作者:源码库 文章热度: 186 ℃ 过期已备案域名,注册就能用!终身VIP会员, ...

  10. 如何查询MySql日志

    如何查询MySql日志 分类: mysql2012-02-23 19:14 26756人阅读 评论(2) 收藏 举报 mysqlcommandprintingserversocketoutput 今天 ...