hash(哈希)是什么

一、什么是哈希

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

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

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

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

二、哈希特性

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

2、计算极快: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的特性,我们下面来剖析。

1、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的数据类型查找速度会快很多。

2、set为何是天生去重的?

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

转载于:https://www.cnblogs.com/Kwan-C/p/11477599.html

hash(哈希)是什么相关推荐

  1. P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold(加强版)(贪心+hash哈希)

    P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold(加强版)(贪心+hash哈希) 洛谷上这道水题丧心病狂地把数据范围加到了500000 普通的做法肯定A不了了, ...

  2. Hash+哈希+哈希函数

    Hash+哈希+哈希函数 hash == 散列 == 哈希 是一种有损压缩技术 是一种数字指纹技术 哈希是一种加密算法 哈希函数(Hash Function),也称为散列函数或杂凑函数.哈希函数是一个 ...

  3. Hash+哈希表+HashMap+HashSet

    Hash+哈希表+HashMap+HashSet 哈希算法,是一类「算法」. 哈希表(Hash Table),是一种「数据结构」. 哈希函数,是支撑哈希表的一类「函数」. Map是映射/地图的意思,在 ...

  4. Hash哈希(hashCode、HashSet 、HashMap)

    文章目录 Hash HashMap类 存储 HashMap的长度 Java的hashCode()方法 hashCode() 与 equals() 的关联 情况1(不重写hashCode()和equal ...

  5. Algorithm:C++语言实现之Hash哈希算法相关(dbj2、sdbm、MurmurHash)

    Algorithm:C++语言实现之Hash哈希算法相关(dbj2.sdbm.MurmurHash) 目录 一.Hash知识 1.dbj2​ 2.sdbm​ 3.MurmurHash Hash Has ...

  6. 什么是Hash哈希(散列表)

    什么是Hash哈希(散列表) 相信学计算机的各位都绝对听过Hash哈希(散列表),有些人认为Hash是一种算法,有人认为它是一种数据结构,其实这些说法都不算太准确.其实hash是一类算法的集合,或者说 ...

  7. redis之Hash哈希类型以及存储原理

    文章目录 1.概述 1.1Redis数据类型 中文官网 (不推荐,更新不及时) 1.2.Redis数据类型 英文官网 (推荐) 2.Hash哈希类型的相关命令 2.1.命令参考地址:http://re ...

  8. hash crc32_Hasher Lite.小巧实用的HASH(哈希)计算小工具

    之前很早的时候程门立学分享过一款计算哈希值的神器小软件,详见HashCalc-MD5.SHA1.CRC32.OR.etc计算校验-windows系统神器之一 ,该软件非常小巧及强大.今天介绍的这款Ha ...

  9. java 图片 哈希值_上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中...

    上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中 前端:要用到一个插件,点击下载 企业用户后台管理系统 - 谭人才招聘系统 function ajaxfile( ...

  10. K:hash(哈希)碰撞攻击

    相关介绍:  哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表.理想情况下哈希表插入和查找操作的时间复杂度均为O(1),任何一个数据项可以在一个与哈希表长度无关的时间内计算出一个哈希值 ...

最新文章

  1. LeetCode 309. Best Time to Buy and Sell Stock with Cooldown--Java解法-卖股票系列题目
  2. 服务总线yali测试_中国信登加快技术测试体系建设支撑系统高质量运行
  3. 20、计算机图形学——微平面理论和Cook-Torrance BRDF
  4. 喝酒撸串聊技术!来看云栖大会15位大咖真人秀
  5. android绑定java,Java-android数据绑定-找不到类android.view.data
  6. oracle 日志 安全审计,等保测评2.0:Oracle安全审计(下)
  7. SQL数据库语言基础之SqlServer数据表的六大约束(主键、外键、检查、非空、唯一性、默认值约束)的创建
  8. python 文本换行_Python学习入门(23)—读写文件
  9. matlab图像分割(肺实质)
  10. android搜狗输入法广告,Android 搜狗输入法 v8.12 去广告纯净版
  11. 如何生成SSH key
  12. 整体改革理论(简介)
  13. Java温习——SUN公司和Java平台
  14. Spring Boot任务管理
  15. python中ifelse语句怎么写_pythonifelse语句怎么写
  16. 厉害|百度28位离职技术大牛和他们创建的AI公司!
  17. linux系统--文件目录
  18. 戴尔 PowerEdge 14G 加速分布式存储解决方案 zData 提升性能
  19. 【Java面试高频-集合】- 读写的场景设计集合是怎么样?对于读多写少要如何设计的呢?对于读少写多又该如何设计呢?
  20. 所有平台emoji表情查询网站,记录一下

热门文章

  1. 函数:计算字符串中大写字母的个数
  2. oracle数据库HugePages配置
  3. 对抗样本的创建和防御
  4. 1月到12月 周一到周日 十二种颜色 用英语怎么说
  5. 风景日历java制作_风景日历制作系统
  6. 揭秘骗术:黑客人肉、查开房的灰色项目
  7. php微信授权登录sdk,微信授权登录如何使用?总结微信授权登录实例用法
  8. brew install oracle,Mac下安装brew
  9. 流量高峰时期的性能瓶颈有哪些、以及如何来解决
  10. 「武汉理工大学 软件工程复习」第三章 | 软件需求