hash,通常翻译为散列、杂凑,或者音译为哈希,是把任意长度的输入(又叫作预映射pre-image)经过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间一般远小于输入的空间。python
它其实就是一个算法,最简单的算法就是加减乘除,比方,我设计个数字算法,输入+7=输出,好比我输入1,输出为8;输入2,输出为9。算法
哈希算法不过是一个更为复杂的运算,它的输入能够是字符串,能够是数据,能够是任何文件,通过哈希运算后,变成一个固定长度的输出,该输出就是哈希值。可是哈希算法有一个很大的特色,就是你不能从结果推算出输入,因此又称为不可逆的算法。数据库
如上所示,“Kwan”通过哈希运算后,会获得一个随机数列,并且无论你的输入文件多大,最后获得的结果都是这么一个固定长度的数列,即便你输入的是一部电影,输出也是这么大。并且经过数列不能推导出输入。函数
一、不可逆:在具有编码功能的同时,哈希算法也做为一种加密算法存在。即,你没法经过分析哈希值计算出源文件的样子,换句话说:你不可能经过观察香肠的纹理推测出猪原来的样子。区块链
二、计算极快:20G高清电影和一个5K文本文件复杂度相同,计算量都极小,能够在0.1秒内得出结果。也就是说,无论猪有多肥,骨头多硬,作成香肠都只要眨眨眼的时间。编码
哈希算法的不可逆特性使其在如下领域使用普遍:加密
一、密码,咱们平常使用的各类电子密码本质上都是基于hash的,你不用担忧支付宝的工做人员会把你的密码泄漏给第三方,由于你的登陆密码是先通过 hash+各类复杂算法得出密文后 再存进支付宝的数据库里的。翻译
二、文件完整性校验,经过对文件进行hash,得出一段hash值 ,这样文件内容之后被修改了,hash值就会变。 MD5 Hash算法的”数字指纹”特性,使它成为应用最普遍的一种文件完整性校验和(Checksum)算法,很多Unix系统有提供计算md5 checksum的命令。设计
三、数字签名,数字签名技术是将摘要信息用发送者的私钥加密,与原文一块儿传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,而后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。若是相同,则说明收到的信息是完整的,在传输过程当中没有被修改,不然说明信息被修改过,所以数字签名可以验证信息的完整性。code
此外,hash算法在区块链领域也使用普遍。
Python 中基于hash的2个数据类型是dict and set , 以前说dict查询速度快,为什么快? 说set天生去重,怎么作到的?其实都是利用了hash的特性,咱们下面来剖析。
一、dict 为什么查询速度超快,且不受dict大小影响 ?
解析:假设我要存14亿人的基本信息
data = { "张三":[23742364782642342323234,28,"山东济南"], "李四":[12124234232311214458271,25,"北京昌平"], "王五":[23030293483727384383929,33,"山东济南"], "赵六":[42302033030302482634674,28,"河北保定"], # "alex":["xxxx"], # "黑姑娘":["xxxx"] # ... }
dict 的每一个key 都要先通过hash生成一段固定长度的hash值,假设生成的hash值以下:
dict会把这些数字按大小排序好放在一个列表里kd = [-10, 53, 67, 81, 99, 123]。当咱们想查找”赵六”的信息时, 会把“赵六”先hash, 获得99这个值,而后拿这个值去到kd列表里找,想象这个列表有14亿个值 ,如何快速找到99? 二分法就行。
只要找到了99的位置,就能够定位到赵六对应的value的值了。 经过2分法查找,每次数据量都会少一半,这样查找最多31次(2**31=2147483648)就能从20亿信息里找到这我的的信息。
固然 dict 真实的查找算法比这个还要复杂些, 这里只是经过这个例子让你们理解下为什么基于hash的数据类型查找速度会快不少。
二、set为什么是天生去重的?
由于每存一个值到set里时, 都要先通过hash,而后经过得出的这个hash值算出应该存在set里的哪一个位置,存的时候会先检查那个位置上有没有值 ,有的话就对比是否相等,若是相等,则再也不存储此值。 若是不相等(即为空),则把新值 存在这。