用人话理解hash算法、特性、唯一性等
背景
博主在本科的时候曾经参加过数学建模,当初提交参赛论文的时候有两个提交时间点,第一个是提交MD5码的时间,第二个是提交具体参赛论文的时间,当初就很纳闷,直接提交论文不就ok吗?为什么多此一举呢
我来告诉大家答案:
- MD5算法是hash算法的一种,使用目的是将一篇论文转化成一个固定的字符串,只要在论文里改动了一点点,比如标点符号、空格等,重新生成的hash值(一个字符串)一定不同,用这点特性可以判断参赛论文在提交了MD5码后有没有再修改论文,或者说是不是你当时提交的论文
- 有的人可能会说,万一不同人的参赛论文出现了同样的hash值(MD5码)怎么办?没关系的,这个概率及其小,大概是1/2^64的概率,就算碰见了也没关系,因为使用的目的是判断参赛论文前后有没有修改,修改了则hash值(MD5码)一定改变
1. hash算法的定义
Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
2. hash算法必须知道的两个小知识
抗碰撞能力:对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。
抗篡改能力:对于一个数据块,哪怕只改动其一个比特位,其hash值的改动也会非常大。
3. 理解hash算法
在客户端与服务器交互的过程中,有些数据是特别重要的,比如账号密码,在绝大多数情况下,为了安全起见,都会使用加密算法进行加密,并将加密后的数据存储在数据库中
比如在登录csdn时候,输入了对应账号的密码,csdn服务器在得到用户输入的密码后,会进行加密处理,比如Sha245算法,得到一个固定长度的hash值,并与数据库中对应账号所拥有加密后的密码进行比较,没有错误则登录成功
像银行之类的更需要加密,而保存在数据库中的为了安全起见全部是加密后的数据
那么,就有疑问了,既然是通过hash值来进行与数据库内容进行验证的,那么我来创造一个具有相同hash值的字符串不就ok了?(这个就是使用数据进行碰撞了,撞对了验证成功,没有撞对就失败)
理论上是可以的,但是几率特别低,低到可以忽略的程度,且不谈某个hash值出现的概率是1/2^64(以MD5举例,其他的可能更大),实际上不会只加密一次的,所以更加难以碰撞出来,几乎碰撞出来就是不可能的事情了
另外,只要改变密码的某一位,其hash值就会天差地别,也不可能通过猜测密码猜出来,比如说:
MD5("version1") = "966634ebf2fc135707d6753692bf4b1e";
MD5("version2") = "2e0e95285f08a07dea17e7ee111b21c8";
得出了的hash值完全不同
有同学可能会想,碰撞概率几乎为0的话,那我不碰撞了,我直接逆转hash值成密码不就可以了?
答案是不可能的,且不说你得到的hash值是通过什么hash算法得来的,可能还是多种hash加密,就算你全部知道了,也是没有办法逆转的,hash值生成是把原始字符串各自通过一些运算(比方均匀分割后通过异或操作),完全不知道是什么运算的,而且一个hash值是可以对应多个内容的,也不一定是自己需要的,更何况原始字符差一个hash只值就完全不同,根本不能通过hash值靠规律猜出来原始字符
4. 结论
- hash值理论可以碰撞出,但实际情况下可能性几乎为0
- 改变字符串的某个值,hash值(好的哈希算法)完全不同
- hash值不可以逆转成具体的原始字符,有不可逆转性
用人话理解hash算法、特性、唯一性等相关推荐
- 神仙打架看不懂?用人话解读NIPS神经网络攻防赛清华三连冠团队模型算法
本文用高中生能听懂的人话介绍了2017NIPS神经网络攻防竞赛清华大学三项冠军团队的算法模型,详细介绍了基本算法FGSM.对抗样本的生成.攻防模型训练.NIPS比赛规则.清华参赛队的模型可迁移性优化策 ...
- 5分钟带你理解一致性Hash算法
转载自 5分钟带你理解一致性Hash算法 一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot s ...
- cdn缓存服务器有网站图片,CDN缓存服务器图片存储一致性hash算法的理解
用hash做缓存,假如有三台服务器,1,2,3,有三万张图片,我想将图片平均缓存到我三台服务器上,一个服务器大概一万张,怎么去实现这个办法呢,可以用hash来取余数进行操作,加入我们是以图片的名字作为 ...
- mysql索引_mysql系列:深入理解mysql 索引特性(屡试不爽的mysql索引总结)
原标题:mysql系列:深入理解mysql 索引特性(屡试不爽的mysql索引总结) mysql为什么使用B+ Tree索引,不使用B- Tree索引? 索引顺序如何生效? 什么是覆盖索引? orde ...
- Hash算法总结(转载)
1. Hash是什么,它的作用 先举个例子.我们每个活在世上的人,为了能够参与各种社会活动,都需要一个用于识别自己的标志.也许你觉得名字或是身份证就足以代表你这个人,但是这种代表性非常脆弱,因为重名的 ...
- 什么是 Hash 算法?
一.什么是 Hash 算法 散列算法(Hash Algorithm),又称哈希算法,杂凑算法,是一种从任意文件中创造小的数字「指纹」的方法.与指纹一样,散列算法就是一种以较短的信息来保证文件唯一性的标 ...
- [区块链] 密码学中Hash算法(基础)
在介绍Hash算法之前,先给大家来个数据结构中对hash表(散列表)的简单解释,然后我再逐步深入,讲解一下hash算法. 一.Hash原理--基础篇 1.1 概念 哈希表就是一种以 键-值(key-i ...
- 一致性 Hash 算法的实际应用
前言 记得一年前分享过一篇<一致性 Hash 算法分析>,当时只是分析了这个算法的实现原理.解决了什么问题等. 但没有实际实现一个这样的算法,毕竟要加深印象还得自己撸一遍,于是本次就当前的 ...
- 转 常见hash算法的原理
散列表,它是基于快速存取的角度设计的,也是一种典型的"空间换时间"的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Has ...
最新文章
- linux下mysql无法访问_Linux系统下无法访问mysql怎么办
- MyBatis批量插入
- hdu4604 不错的子序列问题
- c语言 error 9,C语言求助(_) c:9: error: syntax error before '[' token
- Quick BI助力云上大数据分析---深圳云栖大会 1
- bean包、entity包、mode包、domain包的区别
- latex目录标题中间空一个字符
- 视觉SLAM笔记(61) 单目稠密建图
- 【十六】Jmeter:目录介绍
- 较流行的4个开源协议
- Java 面向对象和封装
- Python 面向对象 —— 静态方法和类方法
- matlab 例题sin,matlab基础练习题(带答案).doc
- CCNA认证考试介绍
- 关于如何把用手机查看原型
- 局部敏感哈希-Locality Sensitivity Hashing
- Android部分手机报 解析包时出现问题 原因与解决方法
- Xamarin Mono For Android
- tf.clip_by_global_norm详解
- 软件测试·系统测试·安全性测试