本文部分内容摘自网络,参考资料链接会在文后给出,在此感谢原作者的分享。
计算理论中,没有Hash函数的说法,只有单向函数的说法。所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数据。用“人类”的语言描述,单向函数就是:如果某个函数在给定输入的时候,很容易计算出其结果来;而当给定结果的时候,很难计算出输入来,这就是单向函数。各种加密函数都可以被认为是单向函数的逼近。Hash函数(或者称为散列函数)也可以看成是单向函数的一个逼近。即它接近于满足单向函数的定义。
Hash函数还有另外的含义。实际中的Hash函数是指把一个大范围映射到一个小范围。把大范围映射到一个小范围的目的往往是为了节省空间,使得数据容易保存。除此以外,Hash函数往往应用于查找上。所以,在考虑使用Hash函数之前,需要明白它的几个限制:
由于实现了Hash的数据结构支持随机读取(即直接定位,而不需要涉及各类查找算法),检索效率非常高,成为了很多存储引擎的首选,著名的有redis、memcache等,但是Hash的特性决定了一些应用场景下的不足:
稍加扩展的话,我们还可以将Hash应用在各种数据分布式技术中,这方面说的比较多的是“一致性哈希算法”,著名的开源分布式NoSQL数据库系统Cassandra就应用了这一算法。
对于数据检索的低层面应用,主要是各类集合类型。在设计相关类型时,要考虑适当的Hash算法,考虑因素主要是以下几个方面:
冲突解决技术可分为两大类:开散列法(又称为链地址法)和闭散列法(又称为开发地址法)。可假设实现Hash结构时,数据存放在预先用数组实现的一片连续的地址空间,两种冲突解决技术的区别在于发生冲突的元素是存储在这片数组的空间之外(开散列法,一般为附加链表形式)还是空间之内(闭散列法)。与闭散列法相比,开散列法有如下优缺点:
在C#中,实现了Hash函数的集合类我知道的有两个:System.Collections.Hashtable和System.Collections.Generic.Dictionary<TKey,TValue>,这两者区别如下:
ps:关于NoSql,文中涉及了若干NoSql数据库,博主就在此简单说下对NoSql的一些个人见解。现在NoSql可谓风生水起,恰如当年web2.0、ajax刚兴起的时候,其实都不是非常高深的技术,但却能打破传统,一领风骚好多年,所以说技术是其次,思想才是最重要的。ok扯远了,NoSql和Sql存储引擎差不多,总归就那么几种,文中说到的Hash是一种,B数是一种,还有LSM树之类的,顶多在局部稍作改进以适应场景。它们真正的区别在于,NoSql不必非常顾忌数据库范式的约束,从而极大提高了读写速度和扩展能力,比如写操作不care事务,在每秒写几万几十万的数据量下,光这点就能甩Sql几条街。可以说各类NoSql的争奇斗艳,其实都是以取消或部分取消数据库范式的约束为前提,看似很小的改变,能换来性能的巨大提升,当然这也伴随着数据冗余、安全性不高等Sqls深恶痛绝的问题。上帝总是公平的,任何事物都没有绝对的好坏,就看你把它们用在什么地方。
参考资料:
转载请注明本文出处:http://www.cnblogs.com/newton/p/4561273.html
原文:http://www.cnblogs.com/newton/p/4561273.html