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

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

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

  1. >>> hash('我爱你')
  2. 3471388576844338423
  3. >>> hash('小猿圈')
  4. 5000768010434506639

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

哈希特性

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

计算极快: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亿人的基本信息

  1. data = {
  2. "张三":[23742364782642342323234,28,"山东济南"],
  3. "李四":[12124234232311214458271,25,"北京昌平"],
  4. "王五":[23030293483727384383929,33,"山东济南"],
  5. "赵六":[42302033030302482634674,28,"河北保定"],
  6. # "alex":["xxxx"],
  7. # "黑姑娘":["xxxx"]
  8. # ...
  9. }

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

用循环输出以下数列:斐波那契数列(要输出20个数字)_Python学习之“为女朋友解释hash是个什么东西”相关推荐

  1. python递归方式和普通方式实现输出和查询斐波那契数列

    斐波那契数列 斐波那契数列(Fibonacci sequence),是从1,1开始,后面每一项等于前面两项之和. 如果为了方便可以用递归实现,要是为了性能更好就用循环. 递归方式实现生成前30个斐波那 ...

  2. 【编程实践】Linux Shell 编程:使用 循环和递归 实现斐波那契数列代码

    用 Linux Shell 编程语言递归实现斐波那契数列代码:循环和递归 Linux Shell 编程语言是一种强大的工具,它可以轻松地实现程序设计语言中的常见算法. 斐波那契数列 斐波那契数列是一种 ...

  3. 【C/C++基础知识点】输出n位斐波那契数列

    目录 前言 什么是斐波那契数列 兔子的故事 小知识点 收尾 前言 在软件行业已经有快十年,技术虽然一般般,但是足够应付额解决编程入门的相关问题! 都说十年磨一剑,积累到一定经验,是时候发挥自己的价值, ...

  4. matlab斐波那契数列画图,斐波拉契数列 斐波那契数列 matlab程序

    斐波那契数列数列从第3项开始,每一项都等于前两项之和. 例子:数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,25 ...

  5. 斐波那契数列编程python_fibonacci数列-斐波那契数列-python编程

    未完待续~ 了解fibonacci数列: 斐波纳契数列(Fibonacci Sequence),又称黄金分割数列. 1,1,2,3,5,8,13,21,34,55,89,144,233,377,610 ...

  6. c语言斐波那契数列_神奇的数列——斐波那契数列

    斐波那契数列之美 斐波那契是一位数学家,生于公元1170年,籍贯大概是比萨,卒于1240年后.1202年,他撰写了<珠算原理>(Liber Abaci)一书.他是第一个研究了印度和阿拉伯数 ...

  7. 斐波那契数列不用数组_兔子数列——斐波那契数列

    相信人们都对斐波那契数列有或多或少的了解,如果没有,那你一定听过黄金分割比或是见过下面这种图片: 斐波那契生活在十三世纪的意大利,原名列奥纳多·皮萨诺(Leonardo Pisano),他出生在意大利 ...

  8. 用循环实现斐波那契数列_剑指 Offer 10- I. 斐波那契数列

    剑指 Offer 10- I. 斐波那契数列 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F ...

  9. PHP输出斐波那契数列

    <?php /** * Created by PhpStorm. * User: Administrator * Date: 2017/2/24 0024 * Time: 上午 10:59 */ ...

最新文章

  1. PDF文字怎么编辑,PDF文档编辑方法
  2. 创建一个触发器新增字段的时候设置某个字段的值
  3. 第八课.EM算法的合理性与算法推导
  4. TensorBoard可视化网络结构和参数Tensorboard windows显示空白
  5. 对于原生代码使用Java线程的优缺点
  6. cocos2d-x游戏开发(十二)场景切换:滑门效果
  7. SM_INTEGRATION_SRV
  8. mysql导入sql脚本命令
  9. 用CSS3来代替JS实现交互
  10. http服务器返回状态代码含义
  11. drupal 迁移_关于如何迁移到Drupal的4个技巧
  12. 语音识别技术的前世今生
  13. SPOJ Problem 22:Triangle From Centroid
  14. VAD实现(一) 读取语音数据
  15. 96微信编辑器服务器老是连不上,96微信编辑器出现文章排版混乱的详细原因介绍...
  16. 大学英语综合教程三 Unit 4 课文内容英译中 中英翻译
  17. 版权符号模糊解决办法
  18. 山东省计算机应用能力考核初级,山东省计算机应用能力考核.doc
  19. echarts青岛市地图下钻到区市及根据各个区市经纬度在各区市地图绘制散点图和道路线
  20. 解决Windows11打不开Windowsdefender(安全中心)

热门文章

  1. JS有哪些数据类型?
  2. Docker基础学习笔记01:Docker安装
  3. Specificity考量
  4. 翻译练习:Hadoop概述
  5. C ++基础 | 从 理解C++程序结构 到 编写程序_1
  6. php加密 java rsa_PHP的DES加密和RSA签名(兼容java)
  7. java怎么实现查找n功能_java 实现微信搜索附近人功能
  8. php滚动图代码,JS上下、左右滚动代码(支持图片滚动)
  9. 【英语学习】【Level 08】U02 Movie Time L1 Let's talk about movies
  10. 代码chaid_适配者 – 研究和分享IT前沿技术,形成以开源软件、代码分享、技术分享、IT职业发展等经验分享网站。...