你去上学,班主任会给你分配一个学号;毕业后上班,HR会给你一个工号;你回家,抬头看得到门牌;你去蒸桑拿,前台会给你一块写着号码的手牌。
从管理者的角度看,为了把一摊事管得有秩序,就得排序。这样,协作系统能定位目标,更好地服务。否则,课程没法排,工资没法算,快递员找不到你家,甚至你在洗完澡结账时都会纠结半天,因为前台搞不清你到底吃了多少果盘。
编号,要注意两个问题:
1)能定位。
2)无重号。
小规模编号如学号,从1、2、3……开始,就能解决问题;中等规模的编号如大企业工号,数字前面得加个字母:A120908;大规模编号如身份证系统,不管是谁,统一18位数字标签贴在你的身份证上。
如果是给互联网里的所有文件编号,标签应该如何贴呢?那可是浩如烟海呀,而且遇到重号问题如何解决?是否专门安排人管这摊事?
有没有效率更高的编号方法呢?有,答案是哈希算法。
维基百科是这样定义哈希算法的:哈希算法是将文件映射为较短的固定长度字符串(哈希值)。
任何计算机文件都由电子信号组成。简单地说,0和1组成了全部的信息世界,即比特世界。
例如,我们眼中的香肠图片如图1-5所示,在比特世界里是这样的:01010111001111010101100101110101……
图1-5
我没写完整,上万位吧,总之就是0和1两个数字排成了一条长龙,这才是这张图片在比特世界里的本来面目,我们把这串长龙称为“二进制文件”。
我们把这条长龙切碎,搅拌之后就得到哈希值:
4f7f56ecc0b725893b59f6428258304a94e40f48
哈希值是哈希算法的最终结果,是文件在互联网里的编号。
你完全不用理解哈希算法如何把二进制文件变成哈希值,那是科学家的事,你只要把哈希函数看作一台屠宰加工机器,就能理解:这台机器能把猪做成等长的香肠,而哈希值就是这根香肠上的纹理。
除了所有哈希值都一样长之外,这些纹理有一些其他特性,能轻巧地用在比特世界的方方面面。
如果两个文件有完全相同的哈希值,那就可以判定它们是同一个文件。这也是哈希值最基本的特性: 相同文件的哈希值相同 ,即复制后的文件与原文件的哈希值相同。
这很容易理解,因为既然是两只一模一样的猪,那将它们用相同方法做出来的香肠应该一样。但如果两只猪其他部位完全相同,只有它们尾巴尖上的一根毛不同,那香肠最终的纹理会完全不同。
源文件稍有改动,哈希值就面目全非。
这一特性使得用哈希值标注的文件无法被篡改,因为哪怕只篡改图1-5上一个像素,马上就能被认出——哈希值会完全不同。
另外,哈希值还有如下特性:
第一,不可逆推。在具备编码功能的同时,哈希算法也作为一种加密算法存在。即你无法通过分析哈希值计算出源文件的样子,换句话说,你不可能通过观察香肠的纹理推测出猪的样子。
第二,计算极快。哈希一部20G的高清电影和一个5K的文本文件复杂度相同,计算量都极小,可以在0.1秒内得出结果。也就是说,不管猪有多肥,骨头多硬,做成香肠都只需要眨眨眼的时间。
能用极快的速度给你的文件编出不重复的号码,而且任何人都无法通过这个号码推算出文件原来的样子,这就是哈希算法的意义。
把文件切碎和搅拌的过程就是哈希算法,而切碎和搅拌的动作,就是加密和压缩,由于不同的烧菜师傅会有不同的刀法,于是就有了很多哈希算法如:CRC-32、MD5和SHA256……名字虽然唬人,可它们之间只是张师傅和李师傅的区别,但不同师傅之间的刀功却有高下,那差距究竟在哪儿呢?
正如前文维基百科的定义,哈希算法只是将文件 映射 为哈希值,“映射”的意思是投影。既然是投影,那可能会出现不同的人有一模一样的影子。因此最终在数学意义上,哈希会发生重号,只是重号概率小到无限接近于零。
这种无限接近于零的概率类似于:明天一早你突然当选美国总统,你从小到大每天都中六合彩,或者下一秒49个外星人在你面前排成7×7方阵的概率。但万一碰到了呢?我们把这种情况称为碰撞。
越好的哈希算法,发生碰撞的概率越小。
可如果只为实现“少发生碰撞”这一个目标,是很容易的,只要把哈希值弄得长长的就可以了。但哈希值最终不是纯数字编号,而是数字与字母的组合,目的也只有一个: 缩短哈希值长度,便于实际应用。 毕竟,没有人会愿意带一根1米长的香肠出差。
如果你要自建一个小型图片网站,使用CRC-32短哈希算法给图片贴标签就足够了,它能为你提供42亿种不同的标签,而且文件名长度(哈希值)永远只有8位。
如果你要检索论文库,MD5算法足够你用:哈希值稍长,但几乎不会有重复,能让你做出足够精准的索引。
而商业级加密,你可以用SHA256:哈希值稍长,但倒推难度极大:人类当前所有计算能力总和的千万倍还不一定能算出来。
因此,无论是CRC-32、MD5、SHA256,还是其他的,并没有绝对最好的哈希算法。只有在不同场景下,衡量成本收益之后,才存在相对最优。
二十年前,如果你去图书馆找一本名叫《美国种族简史》的书,得先思考它属于宗教类还是历史类的图书,然后再去不同的区域翻书架。而现在,你只需轻轻一点,计算机屏幕上的文字就会告诉你有没有这本书,如果有,它在哪里。
图书馆用的是小规模搜索技术贴标签:以前是手工分类,现在是用数据库。
而互联网级别的大规模的搜索就得靠哈希算法生产索引标签了。例如,Google等搜索引擎、迅雷等下载软件、比特币等加密货币,都能通过哈希值准确定位目标。
即使哈希算法乍看起来毫不起眼,无非是做出了一串奇怪的字符,但它却是比特世界里的砖,能盖出高楼大厦,能让比特世界更有序。即使离你再远的信息,在哈希算法的帮助下,都会变得触手可及。
附录 从今天起,你可以自己哈希——哈希工具(见图1-6)
图1-6
1.哈希文件:https://www.sojson.com/image2base64.html读者可以尝试上传任意图片,该网站会返回图片的哈希值。
2.哈希字符:http://www.kjson.com/encrypt/hash/?fm=map (如图1-7所示)。
图1-7
字符“Hello”用SHA256哈希算法得出的哈希值为:185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969。