当前位置: 首页 > Python编程 > Python编程实战技能 > Python编程基础入门 > python hash是什么

python hash是什么

发布时间:2020年09月27日 08:50:43 来源: 点击量:406

【摘要】什么是哈希?hash,一般翻译为散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出

什么是哈希?

hash,一般翻译为散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间。

它其实就是一个算法,最简单的算法就是加减乘除,比方,我设计个数字算法,输入+7=输出,比如我输入1,输出为8;输入2,输出为9。

哈希算法不过是一个更为复杂的运算,它的输入可以是字符串,可以是数据,可以是任何文件,经过哈希运算后,变成一个固定长度的输出,该输出就是哈希值。但是哈希算法有一个很大的特点,就是你不能从结果推算出输入,所以又称为不可逆的算法。

>>> hash('我爱你')
3471388576844338423

如上所示,输入“我爱你”三个字,经过哈希运算后,会得到一个随机数列,而且不管你的输入文件多大,最后得到的结果都是这么一个固定长度的数列,即使你输入的是一部电影,输出也是这么大。而且通过数列不能推导出输入。

哈希特性

不可逆:在具备编码功能的同时,哈希算法也作为一种加密算法存在。即,你无法通过分析哈希值计算出源文件的样子,换句话说:你不可能通过观察香肠的纹理推测出猪原来的样子。

计算极快:20G高清电影和一个5K文本文件复杂度相同,计算量都极小,可以在0.1秒内得出结果。也就是说,不管猪有多肥,骨头多硬,做成香肠都只要眨眨眼的时间。

哈希的用途

哈希算法的不可逆特性使其在以下领域使用广泛:

(1)密码,我们日常使用的各种电子密码本质上都是基于hash的,你不用担心支付宝的工作人员会把你的密码泄漏给第三方,因为你的登录密码是先经过 hash+各种复杂算法得出密文后,再存进支付宝的数据库里的。

(2)文件完整性校验,通过对文件进行hash,得出一段hash值 ,这样文件内容以后被修改了,hash值就会变。 MD5 Hash算法的"数字指纹"特性,使它成为应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。

(3)数字签名,数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。

此外,hash算法在区块链领域也使用广泛。

基于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里的哪个位置,存的时候会先检查那个位置上有没有值 ,有的话就对比是否相等,如果相等,则不再存储此值。 如果不相等(即为空),则把新值存在这。

python学习网,免费的在线学习python平台,欢迎关注!

分享到: 编辑:wangmin

就业培训申请领取
您的姓名
您的电话
意向课程
点击领取

环球青藤

官方QQ

扫描上方二维码或点击一键加群,免费领取大礼包,加群暗号:青藤。 一键加群

绑定手机号

应《中华人民共和国网络安全法》加强实名认证机制要求,同时为更加全面的体验产品服务,烦请您绑定手机号.

预约成功

本直播为付费学员的直播课节

请您购买课程后再预约

环球青藤移动课堂APP 直播、听课。职达未来!

安卓版

下载

iPhone版

下载
环球青藤官方微信服务平台

刷题看课 APP下载

免费直播 一键购课

代报名等人工服务

课程咨询 学员服务 公众号

扫描关注微信公众号

APP

扫描下载APP

返回顶部