听说小卖部在卖盲盒??
上回我们讲到了散列表是个什么东东,这次谈谈里面的一个重点,在此之前我们先看看小卖部的新业务,听说小卖部今天上新产品了,开始卖盲盒~
盲盒是什么呢?就是把任意大小的物品映射成固定大小的物品,这种操作规则就是哈希算法,可以将任意长度的二进制值串因映射成固定长度的二进制值串。最后的得到的盲盒也就是哈希值。
一个优秀的哈希算法要有以下特点:
- 不能从哈希值反向推导出原始数据(所以哈希算法也叫单向哈希算法),你想想,要是能根据盲盒推算出来原来的物品是什么,这时候我们都去买最贵的,那小卖部要倒闭了。
- 对输入数据非常敏感,原始数据修改一个 Bit 得到的哈希值也应该大不相同。相似的物品如果做出的盲盒是相似的,那么这就变成规律,顾客一下子就知道哪些盲盒不值钱了,这小卖部就不能赚大钱了。
- 散列冲突的概率要很小,不同的原始数据,哈希值相同的概率要非常小。盲盒的种类总是有限的,我们尽量要减少在同时上架的盲盒中有相同的,物以稀为贵啊,不然怎么吸引顾客的注意啊。
- 哈希算法的执行效率要高效,较大的文件也能快速计算出哈希值。这就像双十一爆发了,小卖部卖了几百万的盲盒,结果在打包的时候,花费了一个月时候才把盲盒做好,这顾客早就退货了。
注意,以上各点充分解释小编有做奸商的潜力,喔,不……这是一个优秀哈希算法具有的品质。
应用场景
散列函数
首先是散列表中的散列函数,通过散列函数获取哈希值。在散列函数中,有解决散列冲突的方法,所以减少散列冲突的不是重点。更重要的是散列函数的效率问题,这决定了散列表的性能问题。
安全加密
加密的哈希算法:MD5 (MD5 Message-Digest Algorithm,MD5 消息摘要算法)和 SHA(Secure Hash Algorithm,安全散列算法)。哈希算法无法做到零冲突,十三个人中必然会有两个人的在同一月出生。同样的道理,MD5的哈希值是128位的二进制串,能表示 2^128 个数据,数据量超过这个数值时就会有有两个数据的哈希值相同。哈希算法虽然不能反向解析数据,但是可以通过穷举的方法比对计算后得到的哈希值是否相同,进而获取原始数据,所以单纯的使用MD5加密的密码并不是可靠的,另外加密也没有绝对的安全。
唯一标识
同学们都用过网盘存过猫片吧,我们有时候往网盘里面上传文件,有时候可以做到秒传,是不是还以为自己的网速超级快?醒醒吧,你那只是办手机卡送的宽带。
如果有些文件被其他人上传过,那么软件只要扫描一遍你的文件,就能判断两个文件是否相等,如果相等的话,就把已经上传过的那个文件复制一个链接放到你的网盘上,然后传输结束了。
那么问题来了,学习视频那么多,一个视频几百兆甚至几个GB,而且命名还不一样,如果是使用二进制字节去对比的话,肯定是特别慢,那么是怎么能在短时间内判断两个命名不同的文件是否为同一个文件的呢?这就要谈到哈希算法了,文件在计算机中是以二进制方式存储的,最简单的思路就是使用哈希算法(比如 MD5),计算文件哈希值,用这个值作为文件的唯一标志,然后通过与其他文件进行比较,确定两个文件是否为同一文件。这只是最简单的原型算法,实际应用肯定更加复杂一些,毕竟有一定几率存在哈希值相同的不同文件。也可以增加对比的次数解决,比如截取文件其中一部分的,计算哈希值进行对比,对此对比确定文件是否相同。这只是猜测,有大佬了解的话,可以告知一二。
数据校验
不知道有多少小伙伴给妹子的电脑安装过操作系统?不知道又有多少小伙伴遇到过安装过程中因为镜像损坏而安装失败的尴尬情况?下载镜像的过程中没有什么问题,这镜像怎么就关键时刻坏事了呢?我们一般都是使用迅雷或者IDM这种多线程下载工具下载文件, 这相当于并行下载了一个镜像文件,下载的文件那是七零八散的,所有的文件下载完成以后再重新组装在一起。这时候怎么确认你下载的就是原来的文件呢?网站在提供文件的同时,还提供了一个 MD5 的哈希值字符串,这时候我们可以对下载的文件进行处理,使用 MD5 算法计算出它的哈希值,对比计算出的哈希值和网站提供的哈希值是否相等,如果相等则表示下载文件没有问题,如果不同,那么下载的文件损坏了。留个问题,想一想哈希算法的思想是不是可以应用到服务之间优化上面呢?