哈希算法(应用场景)
1.哈希算法介绍
将任意长度的二进制值串映射为固定长度的二进制值串,该映射的规则就是哈希算法。
2.哈希算法满足条件
1.从哈希值不能反向推导出原始数据(哈希算法,单向哈希算法) 2.对输入数据非常敏感,哪怕原始数据只修改了一个bit,最后得到的哈希值也大不相同 3.散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小 4.哈希算法的执行效率要尽量高,针对较长的文本,能够快速计算出哈希值
3.哈希算法应用场景
3.1.安全加密
最常用的加密的哈希算法是MD5(MD5消息摘要算法)和SHA(安全散列算法)。对于加密来说,两个方面比较重要: 1.很难根据哈希值反向推到出原始数据(加密的目的就是防止原始数据泄露) 2.尽量减少碰撞冲突概率(理论上没有办法做到完全不冲突)。这里可以了解鸽巢原理,假如有10个鸽巢,却有11只鸽子。 在实际项目中,为了更加保障数据安全,使用原始数据+盐(salt)方式,一起计算哈希值的方式
3.2.唯一标识
如果要在海量图库中,搜索某张图片是否存在。是否可以直接通过图片的元信息(比如图片名称)进行比对?
答案是:不能。因为可能存在名称相同,但是图片内容不同;或者名称不同,但是图片内容相同的情况。
那么该如何实现搜索呢?
答案:获取图片的二进制信息(二进制码串开头取100个字节+中间取100个字节+最后取100个字节),将拼接在一起的300个字节通过哈希算法,得到哈希值。作为图片的唯一标识即可。
3.3.数据校验
电驴这样的 BT 下载软件我们都有用过。我们知道,BT 下载的原理是基于 P2P 协议的。我们从多个机器上并行下载一个 2GB 的电影,这个电影文件可能会被分割成很多文件块(比如可以分成 100 块,每块大约 20MB)。等所有的文件块都下载完成之后,再组装成一个完整的电影文件就行了。 我们知道,网络传输是不安全的,下载的文件块有可能是被宿主机器恶意修改过的,又或者下载过程中出现了错误,所以下载的文件块可能不是完整的。如果我们没有能力检测这种恶意修改或者文件下载出错,就会导致最终合并后的电影无法观看,甚至导致电脑中毒。 现在的问题是,如何来校验文件块的安全、正确、完整呢? 我们通过哈希算法,对 100 个文件块分别取哈希值,并且保存在种子文件中。哈希算法有一个特点,对数据很敏感。只要文件块的内容有一丁点儿的改变,最后计算出的哈希值就会完全不同。 所以,当文件块下载完成之后,我们可以通过相同的哈希算法,对下载好的文件块逐一求哈希值,然后跟种子文件中保存的哈希值比对。如果不同,说明这个文件块不完整或者被篡改了,需要再重新从其他宿主机器上下载这个文件块。
我们唯一能够控制的是自己的脾气和努力