- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
POCO C++库学习和分析 -- 哈希
Hash 概论
在理解Poco 中的 Hash 代码之前,首先需要了解一下Hash 的基本理论。下面的这些内容和教课书上的内容并没有太大的差别。
定义
下面这几段来自于百度百科:
Hash:一般翻译做散列,也有直接音译为哈希的,就是把任意长度的输入(又
叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
Hash table:散列表,也叫哈希表,是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
若结构中存在关键字和 K 相等的记录,则必定存储在f(K)的位置上。由此,不需比较便可直接取得所查记录。这个对应关系 f 称为散列函数(Hash function),按这个思想建立的表为散列表。
对不同的关键字可能得到同一散列地址, 即 key1 ≠ key2 , 而
f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称做同义词。
综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”, 作为这条记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。这个现象也叫散列桶,在散列桶中,只能通过顺序的方式来查找,一般只需要查找三次就可以找到。科学家计算过,当重载因子不超过 75%,查找效率最高。
* 若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。
Hash table 查找效率
对于 Hash table 来言,理论上查找效率为 O(1)。但在现实世界中,查找的过程存在冲突现象。产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产生冲突多少的因素,也就是影响查找效率的因素。影响产生冲突多少有以下三个因素:
散列函数是否均匀;
处理冲突的方法;
散列表的装填因子。
散列表的装填因子定义为:α = 填入表中的元素个数 / 散列表的长度
实际上,散列表的平均查找长度是装填因子α 的函数,只是不同处理冲突的方法有不同的函数。
Poco 中的Hash 内容
Poco 中的 hash 内容主要关注于 Hash 表的应用。下面是 Poco 中相关于 Hash 的类
图:
我们看到 Poco 的 Hash 内容主要被分成 3 部分:
Hash 函数。Poco 提供了一组 Hash 函数用于,生成 hash 值。同时提供了模板类HashFunction,通过仿函式提供对任意数据结构生成 hash 值的功能。
Hash table(哈希表)。Poco 中实现了 3 种哈希表,分别是 SimpleHashTable, HashTable,LinearHashTable。
在哈希表上的应用,封装出hash map 和 hash set。
Hash 函数
Hash 函数是解决 hash 冲突的第一个要素。
Poco 中提供了一组 Hash 函数,用于产生 hash 值。其定义如下: [cpp] view plaincopy
inline std::size_t hash(Int8 n)
{
return static_caststd::size_t(n)*2654435761U;
}
inline std::size_t hash(UInt8 n)
{
return static_caststd::size_t(n)*2654435761U;
}
inline std::size_t hash(Int16 n)
{
return static_caststd::size_t(n)*2654435761U;
}
inline std::size_t hash(UInt16 n)
{
return static_caststd::size_t(n)*2654435761U;
}
inline std::size_t hash(Int32 n)
{
return static_caststd::size_t(n)*2654435761U;
}
inline std::size_t hash(U
您可能关注的文档
最近下载
- 【《家庭养育环境评价探究的国内外文献综述3000字》】 .docx VIP
- 一(上)数学必考:100道看图列式+应用题.pdf VIP
- 贵州财经大学 汉语写作与百科知识A卷 2017年考研专业课真题.pdf VIP
- 【家庭养育环境评价探析的国内外文献综述3000字】.docx VIP
- 苏教版(2019) 选择性必修1 课时7 逻辑电路设计(选学) 课件.pptx VIP
- 【GB_T51455-2023】 城镇燃气输配工程施工及验收规范.docx VIP
- 新项目方法验证能力确认报告(固定污染源排放烟气黑度的测定 林格曼烟气黑度图法HJT 398-2007)展示版.pdf VIP
- 县级干部党校培训个人总结.docx VIP
- 《黑白装饰画课件》教学课件.pptx VIP
- 苏教版(2019) 选择性必修1 课时3 两种组合逻辑门——与非门、或非门 课件.pptx VIP
文档评论(0)