nykek5i 发表于 2024-8-18 11:18:05

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


    <div style="color: black; text-align: left; margin-bottom: 10px;">
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">什么是哈希?</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">hash,<span style="color: black;">通常</span>翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)<span style="color: black;">经过</span>散列算法变换成固定长度的输出,该输出<span style="color: black;">便是</span>散列值。这种转换是一种压缩映射,<span style="color: black;">亦</span><span style="color: black;">便是</span>,散列值的空间<span style="color: black;">一般</span>远<span style="color: black;">少于</span>输入的空间。 </p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">它其实<span style="color: black;">便是</span>一个算法,最简单的算法<span style="color: black;">便是</span>加减乘除,比方,我设计个数字算法,输入+7=输出,<span style="color: black;">例如</span>我输入1,输出为8;输入2,输出为9。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">哈希算法<span style="color: black;">不外</span>是一个更为<span style="color: black;">繁杂</span>的运算,它的输入<span style="color: black;">能够</span>是字符串,<span style="color: black;">能够</span>是数据,<span style="color: black;">能够</span>是任何文件,经过哈希运算后,变成一个固定长度的输出,该输出<span style="color: black;">便是</span>哈希值。<strong style="color: blue;"><span style="color: black;">然则</span>哈希算法有一个很大的特点,<span style="color: black;">便是</span>你<span style="color: black;">不可</span>从结果推算出输入,<span style="color: black;">因此</span>又<span style="color: black;">叫作</span>为不可逆的算法</strong></p>&gt;&gt;&gt; hash(我爱你)
      3471388576844338423
      &gt;&gt;&gt; hash(小猿圈)
      5000768010434506639<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">如上所示,输入“我爱你”三个字,经过哈希运算后,会得到一个随机数列,<span style="color: black;">况且</span>不管你的输入文件多大,最后得到的结果都是这么一个固定长度的数列,即使你输入的是一部电影,输出<span style="color: black;">亦</span>是这么大。<span style="color: black;">况且</span><span style="color: black;">经过</span>数列<span style="color: black;">不可</span>推导出输入。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">哈希特性</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">不可逆</strong>:在具备编码功能的<span style="color: black;">同期</span>,哈希算法<span style="color: black;">亦</span><span style="color: black;">做为</span>一种加密算法存在。即,你<span style="color: black;">没法</span><span style="color: black;">经过</span>分析哈希值计算出源文件的样子,换句话说:你不可能<span style="color: black;">经过</span>观察香肠的纹理推测出猪原来的样子。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">计算<span style="color: black;">极大</span></strong>:20G高清电影和一个5K文本文件<span style="color: black;">繁杂</span>度相同,计算量都极小,<span style="color: black;">能够</span>在0.1秒内得出结果。<span style="color: black;">亦</span><span style="color: black;">便是</span>说,不管猪有多肥,骨头多硬,做成香肠都只要眨眨眼的时间,</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">哈希的用途</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">哈希算法的不可逆特性使其在以下<span style="color: black;">行业</span><span style="color: black;">运用</span>广泛</p><span style="color: black;">秘码</span>,<span style="color: black;">咱们</span><span style="color: black;">平常</span><span style="color: black;">运用</span>的<span style="color: black;">各样</span>电子<span style="color: black;">秘码</span>本质上都是基于hash的,你<span style="color: black;">不消</span>担心支付宝的工作人员会把你的<span style="color: black;">秘码</span>泄漏给第三方,<span style="color: black;">由于</span>你的登录<span style="color: black;">秘码</span>是先经过 hash+<span style="color: black;">各样</span><span style="color: black;">繁杂</span>算法得出密文后 再存进支付宝的数据库里的文件完整性校验,<span style="color: black;">经过</span>对文件进行hash,得出一段hash值 ,<span style="color: black;">这般</span>文件内容以后被修改了,hash值就会变。 MD5 Hash算法的"数字指纹"特性,使它<span style="color: black;">作为</span>应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有<span style="color: black;">供给</span>计算md5 checksum的命令。数字签名,数字签名技术是将摘要信息用发送者的私钥加密,与原文<span style="color: black;">一块</span>传送给接收者。接收者<span style="color: black;">仅有</span>用发送者的公钥<span style="color: black;">才可</span>解密被加密的摘要信息,<span style="color: black;">而后</span>用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。<span style="color: black;">倘若</span>相同,则说明收到的信息是完整的,在传输过程中<span style="color: black;">无</span>被修改,否则说明信息被修改过,<span style="color: black;">因此呢</span>数字签名能够验证信息的完整性。<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">另外</span>,hash算法在区块链<span style="color: black;">行业</span><span style="color: black;">亦</span><span style="color: black;">运用</span>广泛。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">基于hash的数据类型有<span style="color: black;">那些</span>?</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">Python 中基于hash的2个数据类型是dict and set , 之前说dict<span style="color: black;">查找</span>速度快,<span style="color: black;">为么</span>快? 说set天生去重,怎么做到的?其实都是利用了hash的特性,<span style="color: black;">咱们</span>下面来剖析</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">dict <span style="color: black;">为么</span><span style="color: black;">查找</span>速度超快,且不受dict<span style="color: black;">体积</span>影响 ?</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">解析:假设我要存14亿人的基本信息</p>data = {
      "张三":,
      "李四":,
      "王五":,
      "赵六":,
      # "alex":["xxxx"],
      # "黑姑娘":["xxxx"]
      # ...
      }<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">dict 的<span style="color: black;">每一个</span>key 都要先经过hash生成一段固定长度的hash值,假设生成的hash值如下</p>
      <div style="color: black; text-align: left; margin-bottom: 10px;"><img src="https://p3-sign.toutiaoimg.com/pgc-image/f8febc330e184bd188fbe6be93673520~noop.image?_iz=58558&amp;from=article.pc_detail&amp;lk3s=953192f4&amp;x-expires=1723903920&amp;x-signature=byHDsC2L1JmU1p5DJ%2BeG5eh93s4%3D" style="width: 50%; margin-bottom: 20px;"></div>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">dict会把这些数字按<span style="color: black;">体积</span>排序好放在一个列表里kd = [-10, 53, 67, 81, 99, 123]</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">当<span style="color: black;">咱们</span>想<span style="color: black;">查询</span>"赵六"的信息时, 会把“赵六”先hash, 得到99这个值,<span style="color: black;">而后</span>拿这个值去到kd列表里找,想象这个列表有14亿个值 ,<span style="color: black;">怎样</span>快速找到99? 二分法就行,<span style="color: black;">详细</span>看剖析视频。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">只要找到了99的位置,就<span style="color: black;">能够</span>定位到赵六对应的value的值了。 <span style="color: black;">经过</span>2分法<span style="color: black;">查询</span>,每次数据量都会少一半,<span style="color: black;">这般</span><span style="color: black;">查询</span>最多31次(2**31=2147483648)就能从20亿信息里找到这个人的信息。</p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">当然 dict 真实的<span style="color: black;">查询</span>算法比这个还要<span style="color: black;">繁杂</span>些, 我只是<span style="color: black;">经过</span>这个例子让<span style="color: black;">大众</span>理解下<span style="color: black;">为么</span>基于hash的数据类型<span style="color: black;">查询</span>速度会快<span style="color: black;">非常多</span>。 </p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">set<span style="color: black;">为么</span>是天生去重的? </p>
      <p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">由于</span>每存一个值到set里时, 都要先经过hash,<span style="color: black;">而后</span><span style="color: black;">经过</span>得出的这个hash值算出应该存在set里的哪个位置,存的时候会先<span style="color: black;">检测</span>那个位置上有<span style="color: black;">无</span>值 ,有的话就对比<span style="color: black;">是不是</span>相等,<span style="color: black;">倘若</span>相等,则<span style="color: black;">再也不</span>存储此值。 <span style="color: black;">倘若</span>不相等(即为空),则把新值 存在这。</p>
      <div style="color: black; text-align: left; margin-bottom: 10px;"><img src="https://p3-sign.toutiaoimg.com/dfic-imagehandler/c4a7c82b-7560-468a-a210-055dc10dd695~noop.image?_iz=58558&amp;from=article.pc_detail&amp;lk3s=953192f4&amp;x-expires=1723903920&amp;x-signature=wREaV3%2Bch06u14Q3Hm7zbqtoyO4%3D" style="width: 50%; margin-bottom: 20px;"></div>
    </div>




qzmjef 发表于 2024-10-4 20:43:06

你的努力一定会被看见,相信自己,加油。
页: [1]
查看完整版本: 小猿圈 python学习-hash是个什么东西