[Python学习日记-25] 哈希(HASH)是个什么东西?

[Python学习日记-25] 哈希(HASH)是个什么东西?

简介

哈希的特性

哈希的用途

基于 HASH 的数据类型

简介

        哈希(Hash),也称为散列,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是哈希值(散列值)。这种转换是一种压缩映射,也就是散列值的空间通常远小于输入的空间。其实这种转换就是一个算法,世界上最简单的算法就是加减乘除,打个比方

算法本体为:

输入 + 7 = 输出

输入算法转换输出
11 + 7 =8
22 + 7 =9

        哈希算法不过是一个更为复杂的运算,它的输入可以是字符串,可以是数据,可以是任何文件,而经过哈希运算后,这些东西都会变成一个固定长度的输出,该输出就是哈希值。

        值得注意的是哈希算法有一个很大的特点,就是你不能从结果推算出输入,所以又称为不可逆的算法,这也是为什么哈希可以用于加密密码的原因。

        在 Python 中要把输入转换为哈希值可以使用 hash() 方法,如下代码所示

print(hash("Jove"))
print(hash("Python No.1!"))
print(hash("Python No.1!"))    # 在同一个命令行中同一个字符串进行 hash 结果会一模一样

 代码输出如下:

 

        如上所示,输入“Jove”四个英文字母后,经过哈希运算,会得到一个随机数列,而且不管你的输入文件多大,最后得到的结果都是一个固定长度的数列,即使你输入的是一部电影那么大的文件,输出也是这么大。而且通过数列不能推导出输入。 在我们下载 Python 时在 Python 的官网也能看到哈希值,如下图所示

 

哈希的特性

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

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

 

哈希的用途

        哈希算法的不可逆特性使其在密码、文件完整性校验、数字签名领域广泛使用

一、密码

         我们日常使用的各种电子密码,本质上都是基于哈希的,以支付宝为例,当你付款时无需担心支付宝的数据库管理人员(DBA)会把你的密码泄漏给第三方,因为你的登录密码是先经过哈希和其他各种复杂算法得出密文后,再存进支付宝的数据库里的,所以当你的手机像数据库确认密码是否正确时只是对比哈希值而已,当然真是的过程当然比现在说的复杂得多。

二、文件完整性校验

         通过对文件进行哈希,得出一段哈希值,若文件内容中间被拦截并修改了,哈希值就会发生变化。其中最出名还要数 MD5 Hash 算法,其具有“数字指纹”的特性,这使它成为应用最广泛使用的一种文件完整性校验和(Chacksum)算法,还有不少 Unix 系统有提供计算 MD5 Checksum 的命令。但 MD5 在2004年被王小云教授破解,在此之前 MD5 号称100万年才能破译的MD5密码系统,随后顶尖加密算法 SHA-1,同样也被王小云教授在半年后破解,王小云教授还为中国设计了自己的哈希函数算法——SM3。

三、数字签名领域

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

 

         此外,哈希算法在区块链领域也有广泛应用,人们常说的挖矿就是使用巨量的资源遍历运算出哈希值对应的数据。

 

基于 HASH 的数据类型

        Python 中基于哈希的数据类型有两个分别是字典(dict)和集合(set),在前面介绍字典是说字典的查询速度快,这是为何呢?而当时也说了集合天生去重,怎么做到的呢?其实都是利用了哈希的特性,下面来一一介绍

一、字典(dict)

        字典的查询速度非常快,并且不受字典大小的影响,下面我们假设有14亿人的身份信息存在字典里,而我们需要进行查询

data = {

        "张三":[23742364782642342323234,28,"山东济南"],

        "李四":[12124234232311214458271,25,"北京昌平"],

        "王五":[23030293483727384383929,32,"山东济南"],

        "赵六":[42302033030302482634674,28,"河北保定"],

        # "Jove":[xxxx],

        # "Kerry":[xxxx],

        # ...

}

        字典在创建时会为每一个 key 使用哈希算法生成一段固定长度的哈希值,假设生成的哈希值如下

张三53
李四67
王五81
赵六99
Jove-10
Kerry123

        在为每一个 key 生成完哈希值后,字典会把这些哈希值按照大小顺序排序好,并放在一个列表里,假设为 kd = [-10,53,67,81,99,123];当我们想查找“赵六”的信息时,会把“赵六”先进行哈希得到其哈希值99 ,然后拿这个值去到 kd 列表里找,到这里就会有个疑问了,即使是生成了哈希值也会有14亿个数据在列表当中,像之前那样使用 for 循环进行遍历肯定也会非常漫长,那字典是如何做到快速找到99的呢?其实它用到了数据结构当中的二分法。

二分法:也称为折半查找法,是一种用于在有序数组中查找特定元素的高效算法。

基本原理:

1、首先,确定一个有序数组以及要查找的目标元素。

2、取数组的中间元素,将其与目标元素进行比较。

  • 如果中间元素等于目标元素,则查找成功,返回中间元素的索引。
  • 如果中间元素大于目标元素,则在数组的前半部分继续查找。
  • 如果中间元素小于目标元素,则在数组的后半部分继续查找。

3、重复上述步骤,直到找到目标元素或者确定目标元素不在数组中。

举例:

 在 kd = [-10,53,67,81,99,123] 中查找99

第1步:首先,确定数组的范围是从索引 0 到索引 5

第2步:计算中间索引为 (0 + 5) // 2 = 2,中间元素是 kd[2] = 67

第3步:由于67小于99,所以在数组的后半部分继续查找,范围变为索引3到索引5

第4步:再次计算中间索引为 (3 + 5) // 2 = 4,中间元素是99,查找成功,返回索引4

        在例子里面可以看出在元素数量为6的列表中查找一个数只需要2此查询,和 for 循环遍历需要查询5次才能找到99,并且列表越大,效率提升越明显。在字典中只要到了99的位置,就可以定位到赵六对应的 value 值了。通过二分法查找,每次数据量都会少一半,这样查找最多31次(2^31=2147483648)就能从14亿信息里找到这个人的信息。当然字典真实的查找算法比这个还要复杂, 本篇是通过这个例子让大家理解下为何基于哈希的数据类型查找速度会快很多。但也有缺点,那就是增加数据时会非常慢,这次因为插入一个新的数据之后字典生成的哈希值需要重新排序。

二、集合(set)

         每存一个值到集合里时, 都要先经过哈希,然后通过得出的这个哈希值算出应该存在集合里的哪个位置,存的时候会先检查那个位置上有没有值,有的话就对比是否相等,如果相等,则不再存储此值。如果不相等(即为空——None),则把新值存在为空的位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/879367.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea连接docker 自动化部署

进入Linux服务器 vim /lib/systemd/system/docker.service将 ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock 替换为 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock新建文件 Dockerfile配置Dockerfile文…

iOS六大设计原则设计模式

六大设计原则: 一、单一职责原则 一个类或者模块只负责完成一个职责或者功能。 类似于:UIView 和 CALayer 二、开放封闭原则 对扩展开放,对修改封闭。 我们要尽量通过扩展软件实体来解决需求变化,而不是通过修改已有的代码来…

『功能项目』窗口可拖拽脚本【59】

本章项目成果展示 我们打开上一篇58第三职业弓弩的平A的项目, 本章要做的事情是给坐骑界面挂载一个脚本让其显示出来的时候可以进行拖拽 创建脚本:DraggableWindow.cs using UnityEngine; using UnityEngine.EventSystems; public class DraggableWindo…

nodejs+express+vue教辅课程辅助教学系统 43x2u前后端分离项目

目录 技术栈具体实现截图系统设计思路技术可行性nodejs类核心代码部分展示可行性论证研究方法解决的思路Express框架介绍源码获取/联系我 技术栈 该系统将采用B/S结构模式,开发软件有很多种可以用,本次开发用到的软件是vscode,用到的数据库是…

烧结银胶成为功率模块封装新宠

烧结银胶成为功率模块封装新宠 在科技日新月异的今天,材料科学作为推动工业进步的重要基石,正不断涌现出令人瞩目的创新成果。其中,善仁烧结银胶作为微电子封装领域的一项重大突破,正以其独特的性能优势,逐步成为连接…

Docker torchserve 部署模型流程

1.拉取官方镜像 地址: https://hub.docker.com/r/pytorch/torchserve/tags docker pull pytorch/torchserve:0.7.1-gpu2. docker启动指令 CPU docker run --rm -it -d -p 8380:8080 -p 8381:8081 --name torch-server -v /path/model-server/extra-files:/home/model-serve…

MySQL日志binlog和redo log区别

MySQL binlog简介 MySQL中有两类日志:binlog和redo log,分别有不同的作用和解决问题。binlog是归档日志,在MySQL server层的日志,适用于所有存储引擎,redo log是innodb特有日志用于crash-safe时恢复数据。 binlog和r…

【RabbitMQ】工作模式

工作模式概述 简单模式 简单模式中只存在一个生产者,只存在一个消费者。生产者生产消息,消费者消费消息。消息只能被消费一次,也称为点对点模式。 简单模式适合在消息只能被单个消费者处理的场景下存在。 工作队列模式(Work Qu…

Apache SeaTunnel Zeta引擎源码解析(三) Server端接收任务的执行流程

作者:刘乃杰 编辑整理:曾辉 引入 本系列文章是基于 Apache SeaTunnel 2.3.6版本,围绕Zeta引擎给大家介绍其任务是如何从提交到运行的全流程,希望通过这篇文档,对刚刚上手SeaTunnel的朋友提供一些帮助。 我们整体的文…

linux文件系统权限详解

注:目录的执行权限代表是否可以进入。 一、文件权限控制对文件的访问: 可以针对文件所属用户、所属组和其他用户可以设置不同的权限 权限具有优先级。user权限覆盖group权限,后者覆盖other权限。 有三种权限类别:读取、写入和执行 读权限:对文件:可读取文件…

[SAP ABAP] 修改内表数据

1.利用关键字修改数据 语法格式 MODIFY TABLE <itab> FTOM <wa> [TRANSPORTING f1 f2...].<itab>&#xff1a;代表内表 <wa>&#xff1a;代表工作区 示例1 内表修改前的数据 将上述数据行中的AGE字段值更改为25&#xff0c;SEX字段值更改为女 输出结…

5.基础漏洞——文件上传漏洞

目录 一.文件上传漏洞原理 二.文件上传漏洞条件&#xff1a; 三.上传限制手段分为两大类 (1)客户端校验 (2)服务端校验 四.具体实现 1.文件上传漏洞——绕过JS检测 2.文件上传漏洞——绕过MIME类型检测 3.文件上传漏洞——绕过黑名单检测 绕过方式:(1) 绕过方式:(2) …

城市脉络下的空间句法:整合度与选择度的深度解析

上回写过一篇&#xff0c;基于空间句法的路网整合度、选择度分析&#xff0c;当时碍于篇幅和侧重点&#xff0c;主要讲了如何安装sDNA这个插件来实现路网的整合度、选择度分析&#xff0c;并且分析部分也只是画了几条简单的线段&#xff0c;这次我们深化一下原理和指标的解析&a…

二十种编程语言庆祝中秋节

二十种编程语言庆祝中秋节 文章目录 二十种编程语言庆祝中秋节中秋快乐&#xff01;家人们 &#x1f973;一 Python二 C三 C四 Java五 C#六 Perl七 Go八 Asp九 PHP十 JavaScript十一 JavaScript HTML十二 Visual Basic十三 早期 VB十四 Visual C十五 Delphi十六 Shell十七 Cobo…

Codeforces practice C++ 2024/9/11 - 2024/9/18

D. Mathematical Problem Codeforces Round 954 (Div. 3) 原题链接&#xff1a;https://codeforces.com/contest/1986/problem/D 题目标签分类&#xff1a;brute force&#xff0c;dp&#xff0c;greedy&#xff0c;implementation&#xff0c;math&#xff0c;two pointers…

svn回退到以前历史版本修改并上传

svn回退到以前版本&#xff0c;并在以前版本上修改代码后&#xff0c;上传到svn库当中&#xff0c;如下步骤&#xff1a; 3、 以回退到版本号4为例&#xff1a;选中版本号4&#xff0c;右键->Revert to this version,在出现的对话框中 点击yes&#xff01; 4、 5、

【C++ Primer Plus习题】16.8

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include <set> #includ…

矩阵分析 学习笔记3 多项式矩阵 jordan标准型

多项式矩阵 就是说这个矩阵里面的各个元素都是多项式&#xff0c;多项式的主角是类目大&#xff08;自变量&#xff09;。 多项式矩阵的秩 0多项式就是完全0的那种&#xff0c;就一个0&#xff0c;类目大都没有了。 多项式矩阵的秩和带一个类目大进去变成普通矩阵的秩不是一回…

深度学习|损失函数:网络参数优化基准

文章目录 引言均方误差计算示例矩阵形式代码实现 交叉熵误差计算示例代码实现 绝对误差计算示例代码实现 Hinge Loss计算示例代码实现 Kullback-Leibler Divergence计算示例代码实现 结语 引言 在上文「深度学习&#xff5c;模型训练&#xff1a;手写 SimpleNet」中&#xff0…

十款主流的供应链管理系统盘点,优缺点一目了然!

本文将盘点十款供应链管理系统&#xff0c;为企业选型提供参考&#xff01; 想象一下&#xff0c;一家企业在生产和销售产品的过程中&#xff0c;原材料供应不及时、库存积压严重、物流配送混乱。这时&#xff0c;供应链管理系统就如同一位高效的指挥家&#xff0c;将各个环节紧…