天涯论坛

 找回密码
 立即注册
搜索
查看: 50|回复: 2

小猿圈 python学习-hash是个什么东西

[复制链接]

3073

主题

3万

回帖

9915万

积分

论坛元老

Rank: 8Rank: 8

积分
99158921
发表于 2024-8-18 11:18:05 | 显示全部楼层 |阅读模式

什么是哈希?

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

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

哈希算法不外是一个更为繁杂的运算,它的输入能够是字符串,能够是数据,能够是任何文件,经过哈希运算后,变成一个固定长度的输出,该输出便是哈希值。然则哈希算法有一个很大的特点,便是不可从结果推算出输入,因此叫作为不可逆的算法

>>> hash(我爱你) 3471388576844338423 >>> hash(小猿圈) 5000768010434506639

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

哈希特性

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

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

哈希的用途

哈希算法的不可逆特性使其在以下行业运用广泛

秘码咱们平常运用各样电子秘码本质上都是基于hash的,你不消担心支付宝的工作人员会把你的秘码泄漏给第三方,由于你的登录秘码是先经过 hash+各样繁杂算法得出密文后 再存进支付宝的数据库里的文件完整性校验,经过对文件进行hash,得出一段hash值 ,这般文件内容以后被修改了,hash值就会变。 MD5 Hash算法的"数字指纹"特性,使它作为应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有供给计算md5 checksum的命令。数字签名,数字签名技术是将摘要信息用发送者的私钥加密,与原文一块传送给接收者。接收者仅有用发送者的公钥才可解密被加密的摘要信息,而后用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语言入门(1)-python语言里有哪些东西
下一篇:【将来虫教育】python新式类是什么
回复

使用道具 举报

3073

主题

3万

回帖

9913万

积分

论坛元老

Rank: 8Rank: 8

积分
99138940
发表于 2024-10-4 20:43:06 | 显示全部楼层
你的努力一定会被看见,相信自己,加油。
回复

使用道具 举报

2953

主题

3万

回帖

9997万

积分

论坛元老

Rank: 8Rank: 8

积分
99979403
发表于 6 天前 | 显示全部楼层
认真阅读了楼主的帖子,非常有益。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-25 13:57 , Processed in 0.128227 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.