Hash+哈希+哈希函数

hash == 散列 == 哈希

是一种有损压缩技术

是一种数字指纹技术

哈希是一种加密算法

哈希函数(Hash Function),也称为散列函数或杂凑函数。哈希函数是一个公开函数,可以将任意长度的消息M映射成为一个长度较短且长度固定的值H(M),称H(M)为哈希值、散列值(Hash Value)、杂凑值或者消息摘要(Message Digest)。它是一种单向密码体制,即一个从明文到密文的不可逆映射,只有加密过程,没有解密过程。

它的函数表达式为:h=H(m)

无论输入是什么数字格式、文件有多大,输出都是固定长度的比特串。以比特币使用的Sh256算法为例,无论输入是什么数据文件,输出就是256bit。

每个bit就是一位0或者1,256bit就是256个0或者1二进制数字串,用16进制数字表示的话,就是多少位呢?

16等于2的4次方,所以每一位16进制数字可以代表4位bit。那么,256位bit用16进制数字表示,当然是256除以4等于64位。

于是你通常看到的哈希值,就是这样的了:

00740f40257a13bf03b40f54a9fe398c79a664bb21cfa2870ab07888b21eeba8。

这是从btc.com上随便拷贝的一个哈希值,不放心的话你可以数一下,是不是64位~

哈希算法

把网址A,转换成数字1。网址B,转换成数字2。

一个网址X,转换成数字N,根据数字N作为下标,就可以快速地查找出网址X的信息。这个转换的过程就是哈希算法。

比如这里有一万首歌,给你一首新的歌X,要求你确认这首歌是否在那一万首歌之内。

无疑,将一万首歌一个一个比对非常慢。但如果存在一种方式,能将一万首歌的每首数据浓缩到一个数字(称为哈希码)中,于是得到一万个数字,那么用同样的算法计算新的歌X的编码,看看歌X的编码是否在之前那一万个数字中,就能知道歌X是否在那一万首歌中。

作为例子,如果要你组织那一万首歌,一个简单的哈希算法就是让歌曲所占硬盘的字节数作为哈希码。这样的话,你可以让一万首歌“按照大小排序”,然后遇到一首新的歌,只要看看新的歌的字节数是否和已有的一万首歌中的某一首的字节数相同,就知道新的歌是否在那一万首歌之内了。

一个可靠的哈希算法,应该满足:

对于给定的数据M,很容易算出哈希值X=F(M);

根据X很难反算出M;

很难找到M和N使得F(N)=F(M)

前面提到哈希函数具有抗碰撞性,碰撞性就是指有人实现找出一奇一偶使得哈希结果一致,但这在计算上是不可行的。

首先,把大空间的消息压缩到小空间上,碰撞肯定是存在的。假设哈希值长度固定为256位,如果顺序取1,2,…2^256+1, 这2^256+1个输入值,逐一计算其哈希值,肯定能找到两个输入值使得其哈希值相同。但不要高兴的太早,因为你得有时间把它算出来,才是你的。

根据生日悖论,如果随机挑选其中的2^128+1输入,则有99.8%的概率发现至少一对碰撞输入。那么对于哈希值长度为256位的哈希函数,平均需要完成2^128次哈希计算,才能找到碰撞对。如果计算机每秒进行10000次哈希计算,需要约10^27年才能完成2^128次哈希计算。在区块链中,哈希函数的抗碰撞性用来做区块和交易的完整性验证,一有篡改就能被识别出来。

.........................................

.........................................

一、什么是 Hash 算法

散列算法(Hash Algorithm),又称哈希算法,杂凑算法,是一种从任意文件中创造小的数字「指纹」的方法。与指纹一样,散列算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。因此,当原有文件发生改变时,其标志值也会发生改变,从而告诉文件使用者当前的文件已经不是你所需求的文件。

Hash 算法能将将任意长度的二进制明文映射为较短的二进制串的算法,并且不同的明文很难映射为相同的 Hash 值。

也可以理解为空间映射函数,是从一个非常大的取值空间映射到一个非常小的取值空间,由于不是一对一的映射,Hash 函数转换后不可逆,意思是不可能通过逆操作和 Hash 值还原出原始的值。

散列方法的主要思想是根据结点的关键码值来确定其存储地址:以关键码值K为自变量,通过一定的函数关系h(K)(称为散列函数),计算出对应的函数值来,把这个值解释为结点的存储地址,将结点存入到此存储单元中。检索时,用同样的方法计算地址,然后到相应的单元里去取要找的结点。通过散列方法可以对结点进行快速检索。散列(hash,也称“哈希”)是一种重要的存储方式,也是一种常见的检索方法。

二、Hash 算法有什么特点

Hash 值又称为指纹或者摘要,具有以下特点:

正向快速:给定明文和 Hash 算法,在有限时间和有限资源内能计算得到 Hash 值。

逆向困难:给定 Hash 值,在有限时间内很难逆推出明文。

输入敏感:原始输入信息发生任何变化,新的 Hash 值都应该出现很大变化。

冲突避免:很难找到两段内容不同的明文,使得它们的 Hash 值一致。

三、Hash 算法有哪些

常见 Hash 算法有 MD5 和 SHA 系列,目前 MD5 和 SHA1 已经被破解,一般推荐至少使用 SHA2-256 算法。

下面我们来看具体写一个 Hash 函数需要注意些什么,首先要明白 Hash 函数是把一个大范围映射到一个小范围,目的往往是为了节省空间,使得数据容易保存,另外 Hash 函数也会应用于查找上。

四、Hash 算法碰撞

稍微想一下就可以发现,既然输入数据长度不固定,而输出的哈希值却是固定长度的,这意味着哈希值是一个有限集合,而输入数据则可以是无穷多个,那么建立一对一关系明显是不现实的。所以“碰撞”是必然会发生的,所以一个成熟的哈希算法会有较好的抗冲突性,同时在实现哈希表的结构时也要考虑到哈希冲突的问题。

比如“666”经过 Hash 后是“fae0b27c451c728867a567e8c1bb4e53”,相同 Hash 算法得到的值是一样的。比如 WiFi 密码如果是 8 位纯数字的话,顶多就是 99999999 种可能性,破解这个密码需要做的就是提前生成好 0 到 1 亿数字的 Hash 值,然后做 1 亿次布尔运算(就是 Bool 值判断,0 或者 1),而现在普通 I5 四核 CPU 每秒能到达 200 亿次浮点数计算,做 1 亿次布尔运算也就是秒级别的时间就破解了。

所以密码尽量不要用纯数字,因为根本没有任何安全性。

五、加盐防碰撞

对数字内容进行 Hash 运算,获取唯一的摘要值来指代原始完整的数字内容,利用 Hash 函数的抗碰撞性来确保内容未被篡改。

常用于用户名和密码来确保用户信息安全,为了防止攻击会采用加盐的方法,就是原来的明文加上一个随机数之后的 Hash 值,Hash 值和盐会保存在两个地方,只要不是同时泄漏就很难被破解。

参考:哈希(Hash)算法

参考:通俗易懂的哈希算法讲解

Hash+哈希+哈希函数相关推荐

  1. 1.1. Cryptographic Hash Function.加密哈希函数

    <BITCOIN AND CRYPTOCURRENCY TECHNOLOGIES>Chapter 1系列 1.1. Cryptographic Hash Function.加密哈希函数 目 ...

  2. 布谷鸟哈希函数的参数_系统学习hash算法(哈希算法)

    系统学习hash算法(哈希算法) 转载请说明出处. 前言: 关于本文<系统学习hash算法>的由来.在看到了<十一.从头到尾彻底解析Hash 表算法>这篇文章之后,原文中没有暴 ...

  3. 不同表结构数据迁移_数据结构:哈希 哈希函数 哈希表

    写在前面 希望你们看了能够有所收获,同时觉得不错的朋友可以点赞和关注下我,以后还会有更多精选文章分享给大家!大家可以关注一下java提升专栏 java提升​zhuanlan.zhihu.com 什么是 ...

  4. java一致性hash api_一致性哈希算法学习及JAVA代码实现分析

    戳上面的蓝字关注我们哦! 本文作者:hapjin 欢迎点击下方阅读原文 1,对于待存储的海量数据,如何将它们分配到各个机器中去?---数据分片与路由 当数据量很大时,通过改善单机硬件资源的纵向扩充方式 ...

  5. oracle使用哈希算法,ORA_HASH函数使用的算法是什么?

    Dr Y Wit.. 20 另一个似乎使用ORA_HASH的系统 好吧,如果它"似乎在使用",那么进行一些逆向工程并检查究竟是什么调用和反汇编函数代码是有意义的. 但是,如果您想深 ...

  6. Hash 浅谈哈希算法

    哈希表 哈希表其实就是建立和存储一种映射关系 离散化.桶排序就是一种简单数值哈希 常见的哈希方法: 除法哈希法  hash(key) = keymod M(M为素数) 乘法哈希法  hash(key) ...

  7. Hash表(哈希表、散列表)

    哈希表 概念 为什么需要哈希表 静态查找表与动态查找表中,为了查找某关键字值等于某个值的记录,都要经过一系列的关键字进行比较,以确定待查记录的储存位置或查找失败,查找的时间总是与比较次数有关 什么是哈 ...

  8. 哈希(Hash)和哈希树(Merkle tree)

    哈希函数(英语:Hash function)又称散列函数,是一种从任何一种数据中创建小的数字"指纹"的方法.散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来.该 ...

  9. 重温数据结构:哈希 哈希函数 哈希表

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 在学习 HashMap 前,我们先来温习下 Hash(哈希) 的概念. 什么是 Hash Hash(哈希),又称" ...

最新文章

  1. (兼容IE6)又一个提示框思密达,腾讯UED 201401242352
  2. ref 参数与 out 参数
  3. 视频直播关键技术:流畅、拥塞和延时追赶
  4. Anroid推送服务
  5. serialVersionUID的作用以及如何用idea自动生成实体类的serialVersionUID
  6. Android textedit 背景,Android EditText 的使用及值得注意的地方
  7. Matlab 图像采集工具的使用 - Image Acquisition Toolbox【IAT】 + 大恒相机的应用【1】+多个摄像头支持
  8. GitHub上传文件的过滤规则 -- windows下
  9. pdf电脑地址转网络地址.txt
  10. 一个网站的诞生- MagicDict开发总结1 [首页]
  11. 三菱数控CNC系统G代码M代码大全
  12. 用matlab模拟等离子体论文,等离子体模型的建立
  13. 中国汉字一、二级字库的汉字与unicode编码(十六进制)对照表(收藏)
  14. 冇内容管理系统分析-js中关于array的slice和sort方法(转自JavaEye)
  15. 开屏展示图的优化与理解
  16. Tapestry介绍
  17. 本草纲目pdf彩图版下载_本草纲目彩色图谱下载
  18. u盘数据恢复大师要钱吗?你是为了什么而寻找它的
  19. 蓝桥杯比赛准备第一天
  20. 梦幻手游2016年所有服务器信息,《梦幻西游》手游2016年5月4日新版本介绍

热门文章

  1. 如何确定python对应电脑版本_查看Anaconda版本、Anaconda和python版本对应关系和快速下载...
  2. ai取代程序员_你现在从事的程序员还有多久会消失?牛津大学研究员帮你算了算...
  3. python跨文件全局变量_Python 进程之间共享数据(全局变量)的方法
  4. CVPR 2021 | 论文大盘点:3D目标检测
  5. 三维重建关键技术分享:特征检测+匹配+RT恢复+稠密重建方法
  6. CVPR 2021 | 国防科大:基于几何稳定性分析的物体位姿估计方法
  7. 手把手实现火爆全网的视频特效 “蚂蚁呀嘿”,太魔性了
  8. MATLAB语法基础
  9. 指针,引用之间的关系
  10. CentOS 7.7 安装cmake3