引言
在数据库中建立索引是为了对文件进行快速访问,但是象百度这样的云盘,不仅文件量巨大,而且同时在建立的文件数据也非常巨大,如果每个文件都建立唯一的索引,会有大量重复的文件,同时还要考虑性能和效率,那么如何实时建立索引呢?
数字摘要
数字摘要是将任意长度的消息变成固定长度的短消息,它类似于一个自变量是消息的函数,也就是Hash函数。数字摘要就是采用单向Hash函数将需要加密的明文“摘要”成一串固定长度(128位)的密文这一串密文又称为数字指纹,它有固定的长度,而且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致[百度百科:数据摘要]。
数字摘要需要有以下几个特性
- 唯一性
对同一数据进行的摘要,生成的是唯一的字符串。 - 不可逆性
无法通过生成的数字摘要推断出原数据内容。 - 雪崩性
对输入数据进行任意小的轻微修改,就会使输出的数字摘要发生巨大变化。以MD5为例,hello,world!C0E84E870874DD37ED0D164C7986F03AHello,world!6B7404B3F87E49376FAC3B6A43DBE3BE - 高效性
可以快速计算,对CPU和内存资源要求低。
问题解决
数据摘要常见的有MD5,SHA1,SHA256等,其中:
- MD5 可生成128位数字摘要,可表示的可能为
- SHA1 可生成160位数字摘要,可表示的可能为
- SHA256 可生成256位数字摘要,可表示的可能为
其中,SHA256的可能,已经和整个宇宙的原子数量差不多的量级了(宇宙总原子数大约为1080个),所以根据以上结果,在云服务中使用SHA256已经足够了,两个不同的文件具有相同的SHA256的摘要的几率几乎等对宇宙中所有原子进行抽奖,连续两次都抽中同一原子的概率。我们再来估计一下实际的买号,假设全球所有人都使用云服务,平均每人每天产生10000个文件,那么每个千年会产生的文件个数是 而已,这与1077相关了57个量级,即重复的可能性为1/1057机率,结果就是0,是不可能发生的。
如果有人较真说,那么在这一千年中,真的发生了一次会怎么样?答案很简单,如果文件A和文件B有相同的摘要,大不了在定位的时候发生错误,在索取文件A和文件B时,都会返回文件A而已,无法获得文件B了。所以,不是什么大事,人工解决一下即可。