python中哈希是什么意思_python hash是什么
什么是哈希?
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平台,欢迎关注!
python中哈希是什么意思_python hash是什么相关推荐
- python中字典和集合的区别_Python中字典和集合学习小结
映射类型: 表示一个任意对象的集合,且可以通过另一个几乎是任意键值的集合进行索引 与序列不同,映射是无序的,通过键进行索引 任何不可变对象都可用作字典的键,如字符串.数字.元组等 包含可变对象的列表. ...
- 在python中print表示的数据类型是_python之数据类型
每一种计算机语言都有自己的数据类型,但大多数计算机语言的数据类型都基本一致,下来我们来看看python中的数据类型 int数字,运算 就是用来计算的,定义方式就是 :变量名 = 数值 方法也不多,就记 ...
- json和python中字典的区别和联系_Python 中json与字典的关系
Python开发中字典和 json的概念区别: json.dumps( dict ) 字典变为字符 json.loads( jsoninput ) 字符变为字典 一.字典 字典是一种数据结构,而jso ...
- python中浮点型占几个字节_Python基本数据类型
一.简介 Python基本数据类型一般分为:数字.字符串.列表.元组.字典.集合这六种基本数据类型. 其中数字又包含整型(整型又包括标准整型.长整型(Python2.7及之前版本有)).浮点型.复数类 ...
- json和python中字典的区别和联系_python中字典和json的区别
定义 python中,json和dict非常类似,都是key-value的形式,而且json.dict也可以非常方便的通过dumps.loads互转.既然都是key-value格式,为啥还需要进行格式 ...
- python中常数e_常数python_python 常数_python 常数e - 云+社区 - 腾讯云
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 在python3.7以前我们可以通过import pdb的pdb.set_tra ...
- python中字典的基本形式是什么_python中的字典详细介绍
2014 一.什么是字典? 字典是Python语言中唯一的映射类型. 映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表. 字典对象是可变的,它 ...
- python中str的index什么意思_python中index的用法是什么
index() 一般用处是在序列中检索参数并返回第一次出现的索引,没找到就会报错,比如:>>> t=tuple('Allen') >>> t ('A', 'l', ...
- python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...
GIL锁 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行 ...
- python中函数包括标准库函数吗_Python语言和标准库(第二章:函数)
a-如何创建函数. b-给出一些指导原则,帮助思考如何创建和组织程序以使用函数. c-如何编写函数,使随后可以询问它们的工作方式和实现的功能. 2.1将程序放在单独的文件里 为了更加方便,从现在开始, ...
最新文章
- 实战postfix邮件发送
- visio取消首字母大写
- java正则表达式所有字符串_java正则表达式获取字符串中所有匹配的内容
- ItemAdding事件接收器中无法取到【创建者】的字段的值
- svn教程----svn简介
- Memcached 1.5.13 发布,支持 TLS
- Java RGB数组图像合成 ImageCombining (整理)
- git服务器维护 备份,gitlab服务运维,备份与恢复 - 橙子柠檬's Blog
- ip68级防水可以泡多久_iPhone8防水级别升级至IP68:能在1.5米深水中坚持30分钟
- linux 镜像错误,VituralBox 使用已有镜像文件报错:E_INVALIDARG (0x80070057)
- java treemap lastkey,java.util.TreeMap.higherKey()方法实例
- 【报告分享】2019中国硬科技发展白皮书(195页官方版).pdf(附下载链接)
- linux 安装apache、tomcat问题汇总
- 微信 百度云 服务器繁忙,百度网盘搜索功能失效提示操作过于频繁如何解决
- iphone 升级后闪退
- 网页计算机谈音乐,如何用windows电脑录制网页上或电脑中自己的音乐
- JVM系列(十七):字节码指令集
- Blazor Web Assembly (WASM) 主题切换
- 转发:IT行业中的甲方乙方关系
- 使用Java开发高性能网站需要关注的那些事儿