谈谈个人对MD5的理解

MD5确实是一种很好的算法,但其实我们每个人都应该知道有一种算法比它更好,那就是随机映射。我们来考虑everything(∞)→^[0-9a-fA-F]{32}$2^32)所有函数中的随机函数,以此来理解MD5(因为这是MD5想努力达到的效果)。

压缩性:任意大小的东西都能映射成32个字符长的字符串,压缩性毋庸置疑。

抗修改性:只要初始数据不同(哪怕只是改变1bit),那么它们随机映射的结果可以千差万别。因为随机映射只在乎一种关系,那就是相等。

强抗碰撞:我们可以很容易从下表看出这个结论,以第三条数据为例:它表示1000object随机映射成1000个不同结果的概率为0.999883707846928

   个数

       概率

      10

1 - 0.999999989522621

     100

1 - 0.999998847488969

    1000

1 - 0.999883707846928

   10000

 1 - 0.9884271100137823

  100000

 1 - 0.3121877180362987

可能上面的表还不是很直观,我们再来看另一张表,以第3条数据为例:它表示从1000个另外的object中找出与已知object有相同的映射值的概率为 1 - 0.9999997671693563

(计算值可能失真比较严重,用double类型计算的)

   个数

       概率

       10

  1 - 0.9999999976716936

      100

  1 - 0.9999999767169356

     1000

  1 - 0.9999997671693563

    10000

  1 - 0.9999976716962719

      1E5

  1 - 0.9999767172066759

    1E6

  1 - 0.9997671964592632

1E7

  1 - 0.9976744019662157

1E8

  1 - 0.976985894733949

 容易计算:这也是MD5的优美之处。它可以经过简单、有限、有序的操作,近似达成随机映射的效果。

你可能感兴趣的:(数据结构和算法)