任何

段信息文字

都可以对应

个不太长

随机数

作为区别它和其它信息

指纹(Fingerpr

)

只要算法设计

好

任何两段信息

指纹都很难重复

就如同人类

指纹

样

信息指纹在加密、信息压缩和处理中有着广泛

应用

我们在图论和网络爬虫

文中提到

为了防止重复下载同

个网页

我们需要在哈希表中纪录已经访问过

网址(URL)

但是在哈希表中以

串

形式直接存储网址

既费内存空间

又浪费查找时间

现在

网址

般都较长

比如

如果在 Google 或者百度在查找数学的美

对应

网址长度在

百个

以上

下面是百度

链接
http://www.baidu.com/s?ie=gb2312&bs=%CA%FD%D1%A7%D6%AE%C3%C0&sr=&z=&cl=3&f=8
&wd=%CE%E2%BE%FC+%CA%FD%D1%A7%D6%AE%C3%C0&ct=0
假定网址

平均长度为

百个


那么存贮 200 亿个网址本身至少需要 2 TB

即两千 GB

容量

考虑到哈希表

存储效率

般只有 50%

实际需要

内存在 4 TB以上

即使把这些网址放到了计算机

内存中

由于网址长度不固定

以

串

形式查找

效率会很低

因此

我们如果能够找到

个


将这 200 亿个网址随机地映射到128 2进位即 16 个字节

整数空间

比如将上面那个很长


串对应成

个如下

随机数:
893249432984398432980545454543
这样每个网址只需要占用 16 个字节而不是原来


百个

这就能把存储网址

内存需求量降低到原来

1/6

这个16 个字节

随机数

就称做该网址

信息指纹(Fingerpr

)

可以证明

只要产生随机数

算法足够好

可以保证几乎不可能有两个

串

指纹相同

就如同不可能有两个人

指纹相同

样

由于指纹是固定

128 位整数

因此查找

计算量比

串比较小得多

网络爬虫在下载网页时

它将访问过

网页

网址都变成

个个信息指纹

存到哈希表中

每当遇到

个新网址时

计算机就计算出它

指纹

然后比较该指纹是否已经在哈希表中

来决定是否下载这个网页

这种整数

查找比原来

串查找,可以快几倍到几十倍

产生信息指纹

关键算法是伪随机数产生器算法(prng)

最早

prng 算法是由计算机的父冯诺伊曼提出来


他

办法非常简单

就是将

个数

平方掐头去尾

取中间

几位数

比如

个 4位

2进制数 1001(相当于十进制

9)

其平方为 01010001 (十进制

81)掐头去尾剩下中间

4位 0100

当然这种思路方法产生

数字并不很随机

也就是说两个区别信息很有可能有同

指纹

现在常用

MersenneTwister 算法要好得多

信息指纹

用途远不止网址

消重

信息指纹


孪生兄弟是密码

信息指纹


个特征是其不可逆性, 也就是说,无法根据信息指纹推出原有信息

这种性质

正是网络加密传输所需要


比如说


个网站WebSite可以根据用户

Cookie 识别区别用户

这个 cookie 就是信息指纹

但是网站WebSite无法根据信息指纹了解用户

身份

这样就可以保护用户

隐私

在互联网上

加密

可靠性

取决于是否很难人为地找到拥有同

指纹

信息

比如

个黑客是否能随意产生用户

cookie

从加密

角度讲 MersenneTwister

算法并不好


它产生

随机数有相关性

互联网上加密要用基于加密伪随机数产生器(csprng)

常用

算法有 MD5 或者 SHA1 等标准

它们可以将不定长

信息变成定长

128 2进位或者 160 2进位随机数

值得

提

事

SHA1 以前被认为是没有漏洞


现在已经被中国

王小云教授证明存在漏洞

但是大家不必恐慌


这和黑客能真正攻破你

注册信息是还两回事

信息指纹

虽然历史很悠久

但真正

广泛应用是在有了互联网以后

这几年才渐渐热门起来