本文部分内容摘自网络,参考资料链接会在文后给出,在此感谢原作者的分享。

计算理论中,没有Hash函数的说法,只有单向函数的说法。所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数据。用“人类”的语言描述,单向函数就是:如果某个函数在给定输入的时候,很容易计算出其结果来;而当给定结果的时候,很难计算出输入来,这就是单向函数。各种加密函数都可以被认为是单向函数的逼近。Hash函数(或者称为散列函数)也可以看成是单向函数的一个逼近。即它接近于满足单向函数的定义。

Hash函数还有另外的含义。实际中的Hash函数是指把一个大范围映射到一个小范围。把大范围映射到一个小范围的目的往往是为了节省空间,使得数据容易保存。除此以外,Hash函数往往应用于查找上。所以,在考虑使用Hash函数之前,需要明白它的几个限制:

  • Hash的主要原理就是把大范围映射到小范围;所以,你输入的实际值的个数必须和小范围相当或者比它更小。不然冲突就会很多。
  • 由于Hash逼近单向函数;所以,你可以用它来对数据进行加密。
  • 不同的应用对Hash函数有着不同的要求;比如,用于加密的Hash函数主要考虑它和单项函数的差距,而用于查找的Hash函数主要考虑它映射到小范围的冲突率。

由于实现了Hash的数据结构支持随机读取(即直接定位,而不需要涉及各类查找算法),检索效率非常高,成为了很多存储引擎的首选,著名的有redis、memcache等,但是Hash的特性决定了一些应用场景下的不足:

  • Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。
  • Hash 索引无法被用来避免数据的排序操作。(即Hash函数并不会自排序,相对的如B树,本身带有排序信息,在节点增删改时按规则维护)
  • Hash 索引不能利用部分索引键查询。

稍加扩展的话,我们还可以将Hash应用在各种数据分布式技术中,这方面说的比较多的是“一致性哈希算法”,著名的开源分布式NoSQL数据库系统Cassandra就应用了这一算法。

对于数据检索的低层面应用,主要是各类集合类型。在设计相关类型时,要考虑适当的Hash算法,考虑因素主要是以下几个方面:

  • 计算Hash值所需的时间。
  • Hash表长度。
  • Hash值分布情况。
  • 数据的查找频率。
  • Hash值冲突(重复)的概率。

冲突解决技术可分为两大类:开散列法(又称为链地址法)和闭散列法(又称为开发地址法)。可假设实现Hash结构时,数据存放在预先用数组实现的一片连续的地址空间,两种冲突解决技术的区别在于发生冲突的元素是存储在这片数组的空间之外(开散列法,一般为附加链表形式)还是空间之内(闭散列法)。与闭散列法相比,开散列法有如下优缺点:

  • 开散列法处理冲突无二次聚集现象,因此平均查找时间较短。
  • 由于开散列法中各链表上的节点空间是动态申请的,因此适合无法确定表长的情况。
  • 指针需要额外空间,故当记录规模较小时,闭散列法较为节省空间。
  • 在.NET中,链表的各个元素分散于托管堆各处,这会给垃圾回收带来压力,影响程序性能。

在C#中,实现了Hash函数的集合类我知道的有两个:System.Collections.Hashtable和System.Collections.Generic.Dictionary<TKey,TValue>,这两者区别如下:

  • Hashtable采用闭散列法来解决冲突,而Dictionary采用开散列法来解决冲突。
  • Hashtable在空间不够时,会自动扩容,在扩容时会重新计算所有元素的哈希码和哈希地址,会消耗大量时间进行计算,Dictionary不存在这个问题(自然Dictionary在空间不够时也要开辟新的空间,不过不需要重新计算和安排原有数据的哈希值和哈希地址,这方面内容可看Dictionary的源码便一清二楚了。
  • Hashtable的线程安全包含几个层次,默认可由多个读取器线程一个写入线程使用;若要允许多线程写入(在没有线程读取的情况下),则需要通过Synchronized方法返回的包装完成;如果使用一个或多个读取器以及一个或多个编写器,则Synchronized包装不提供线程安全的访问,此时应使用SyncRoot锁定集合。(MSDN说了这么多,然后告诉我说Hashtable是线程安全的,难道不是在玩我?)Dictionary没这么复杂,只要Lock(SyncRoot)即可。

ps:关于NoSql,文中涉及了若干NoSql数据库,博主就在此简单说下对NoSql的一些个人见解。现在NoSql可谓风生水起,恰如当年web2.0、ajax刚兴起的时候,其实都不是非常高深的技术,但却能打破传统,一领风骚好多年,所以说技术是其次,思想才是最重要的。ok扯远了,NoSql和Sql存储引擎差不多,总归就那么几种,文中说到的Hash是一种,B数是一种,还有LSM树之类的,顶多在局部稍作改进以适应场景。它们真正的区别在于,NoSql不必非常顾忌数据库范式的约束,从而极大提高了读写速度和扩展能力,比如写操作不care事务,在每秒写几万几十万的数据量下,光这点就能甩Sql几条街。可以说各类NoSql的争奇斗艳,其实都是以取消或部分取消数据库范式的约束为前提,看似很小的改变,能换来性能的巨大提升,当然这也伴随着数据冗余、安全性不高等Sqls深恶痛绝的问题。上帝总是公平的,任何事物都没有绝对的好坏,就看你把它们用在什么地方。

参考资料:

Hash函数的几种

一致性哈希算法应用及优化(最简洁明了的教程)

三种基本的存储引擎比较

NoSQL数据库探讨之一 - 为什么要用非关系数据库?

转载请注明本文出处:http://www.cnblogs.com/newton/p/4561273.html

Hash函数及其应用相关推荐

  1. Hash函数的安全性

    我们为了保证消息的完整性,引进了散列函数,那么散列函数会对安全正造成什么影响呢?这是需要好好研究一番的问题. 三个概念: 1.如果y<>x,且h(x)=h(y),则称为碰撞. 2.对于给定 ...

  2. Hash 函数资源链接汇总

    Hash 链接: [1]General Purpose Hash Function Algorithms:http://www.partow.net/programming/hashfunctions ...

  3. HashMap中的hash函数

    在写一个HashSet时候有个需求,是判断HashSet中是否已经存在对象,存在则取出,不存在则add添加.HashSet也是通过HashMap实现,只用了HashMap的key,value都存储一个 ...

  4. 文本去重之MinHash算法——就是多个hash函数对items计算特征值,然后取最小的计算相似度...

    来源:http://my.oschina.net/pathenon/blog/65210 1.概述 跟SimHash一样,MinHash也是LSH的一种,可以用来快速估算两个集合的相似度.MinHas ...

  5. Cuckoo hash算法分析——其根本思想和bloom filter一致 增加hash函数来解决碰撞 节省了空间但代价是查找次数增加...

    基本思想: cuckoo hash是一种解决hash冲突的方法,其目的是使用简单的hash 函数来提高hash table的利用率,同时保证O(1)的查询时间 基本思想是使用2个hash函数来处理碰撞 ...

  6. 常见的一些 Hash 函数

    Hash的主要原理就是把大范围映射到小范围:所以,你输入的实际值的个数必须和小范围相当或者比它更小.不然冲突就会很多. 不同的应用对Hash函数有着不同的要求:比如,用于加密的Hash函数主要考虑它和 ...

  7. 认知理论与技术(hash函数,SHA,MD

    概述: 认证是个过程,通过这个过程一个实体向另一个实体证明某种声称的属性 认证参数: "口令"相当于平时登录系统时输入的密码. "密钥"相当于公钥密码体制中的私 ...

  8. 密码学基础知识(六)Hash函数与消息认证

    Hash函数和消息认证 先说Hash 哈希函数,可以将任意长度的消息压缩为某一固定长度的消息摘要函数.一句话,Hash简直了. 当然有逆天的一面就有大缺点,过程不可逆.傻了吧,哈哈. Hash的性质: ...

  9. hash函数查找和ASL计算

    Hash表的"查找成功的ASL"和"查找不成功的ASL" ASL指的是 平均查找时间 关键字序列:(7.8.30.11.18.9.14) 散列函数:  H(Ke ...

最新文章

  1. R语言rms包生存分析之限制性立方样条(RCS, Restricted cubic spline)分析:拟合连续性自变量和事件风险之间的关系并绘制直方图、平滑曲线、双Y轴于同一个图像中
  2. VM虚拟机桥接模式无法联网解决办法
  3. linux服务器centos系统apache路径不区分大小写的解决办法(适用WDCP面板)
  4. 浪潮POWER 9:英特尔的挑战者
  5. python wxpython backend wxagg_[宜配屋]听图阁
  6. MATLAB中:左右除法、逆inv、广义逆pinv的区别
  7. Linux学习之系统编程篇:shm 共享内存及其操作函数
  8. Mozilla开发全新的公开网络API WebXR 来实现增强现实
  9. Quartz 之入门示例
  10. 【Python3网络爬虫开发实战】1.4.1-MySQL的安装
  11. opengl学习笔记 (一)
  12. java小球游戏项目实战
  13. 让一让,神州泰岳要进化了
  14. 不爱跳槽、月薪集中在 8K-17k、五成欲晋升为技术Leader|揭晓中国开发者真实现状
  15. Linux中/proc目录下文件详解(一)
  16. 最近,前端开发把我恶心着了,为了甩锅,我写了个牛逼的日志切面!
  17. Java开发笔记(一百四十)JavaFX的选择框
  18. 【commons-beanutils专题】003- PropertyUtils 专题
  19. 中国石油大学《画法几何》在线考试
  20. OC Foundation框架 字典

热门文章

  1. python拼音怎么写-Python 中拼音库 PyPinyin 的用法
  2. 在Ubuntu上通过VNC Viewer连接Jetson nano桌面
  3. 题目1206:字符串连接
  4. 题目1174:查找第K小数
  5. /dev/null 位桶
  6. tomcat 随windows启动
  7. JavaWeb 基于Session的用户登陆注销实现
  8. VC++ 文件和应用程序关联,默认图标不显示问题
  9. LeetCode 64. Minimum Path Sum(最小和的路径)
  10. codeforces 547B【单调栈】