引言

在数据库中建立索引是为了对文件进行快速访问,但是象百度这样的云盘,不仅文件量巨大,而且同时在建立的文件数据也非常巨大,如果每个文件都建立唯一的索引,会有大量重复的文件,同时还要考虑性能和效率,那么如何实时建立索引呢?

数字摘要

数字摘要是将任意长度的消息变成固定长度的短消息,它类似于一个自变量是消息的函数,也就是Hash函数。数字摘要就是采用单向Hash函数将需要加密的明文“摘要”成一串固定长度(128位)的密文这一串密文又称为数字指纹,它有固定的长度,而且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致[百度百科:数据摘要]

数字摘要需要有以下几个特性

  • 唯一性
    对同一数据进行的摘要,生成的是唯一的字符串。
  • 不可逆性
    无法通过生成的数字摘要推断出原数据内容。
  • 雪崩性
    对输入数据进行任意小的轻微修改,就会使输出的数字摘要发生巨大变化。以MD5为例,
    hello,world! \rightarrow C0E84E870874DD37ED0D164C7986F03A
    Hello,world! \rightarrow 6B7404B3F87E49376FAC3B6A43DBE3BE
  • 高效性
    可以快速计算,对CPU和内存资源要求低。

问题解决

数据摘要常见的有MD5,SHA1,SHA256等,其中:

  • MD5 可生成128位数字摘要,可表示的可能为 2128=3.40×1038;2^{128}=3.40\times10^{38};
  • SHA1 可生成160位数字摘要,可表示的可能为 2160=1.46×1048;2^{160}=1.46\times10^{48};
  • SHA256 可生成256位数字摘要,可表示的可能为 2128=1.16×1077;2^{128}=1.16\times10^{77};

如何快速高效地给海量云文件建立索引
其中,SHA256的可能,已经和整个宇宙的原子数量差不多的量级了(宇宙总原子数大约为1080个),所以根据以上结果,在云服务中使用SHA256已经足够了,两个不同的文件具有相同的SHA256的摘要的几率几乎等对宇宙中所有原子进行抽奖,连续两次都抽中同一原子的概率。我们再来估计一下实际的买号,假设全球所有人都使用云服务,平均每人每天产生10000个文件,那么每个千年会产生的文件个数是 2.56X10202.56 X10^{20}而已,这与1077相关了57个量级,即重复的可能性为1/1057机率,结果就是0,是不可能发生的。

如果有人较真说,那么在这一千年中,真的发生了一次会怎么样?答案很简单,如果文件A和文件B有相同的摘要,大不了在定位的时候发生错误,在索取文件A和文件B时,都会返回文件A而已,无法获得文件B了。所以,不是什么大事,人工解决一下即可。

相关文章:

  • 2021-05-26
  • 2021-12-07
  • 2021-04-26
  • 2021-07-03
  • 2021-05-19
  • 2021-10-28
  • 2021-12-14
猜你喜欢
  • 2022-02-02
  • 2021-12-17
  • 2022-12-23
  • 2021-12-23
  • 2022-12-23
  • 2021-12-12
相关资源
相似解决方案