zoukankan      html  css  js  c++  java
  • 信息指纹及其应用

    信息指纹及其应用


    以下内容摘录自《数学之美》,作了部分的摘取,在此声明。

    信息指纹

    一段文字中包含的信息是信息熵,理论上无损编码最短长度就是信息熵,但如果仅仅区分几段文字或者图片,则不需要这么长的编码,任何一段信息文字,都可以对应一个不太长的随机数,作为区别它和其它信息的指纹(Fingerprint)。只要算法设计的好,任何两段信息的指纹都很难重复,就如同人类的指纹一样。信息指纹在加密、信息压缩和处理中有着广泛的应用。
    比如在网络爬虫中,如果将访问过的网址URL以字符串的形式直接存储将浪费资源和时间,而如果将这段长的网址字符串对应为一个随机数,就能把大大降低网址的内存需求。而这个随机数叫做网址的信息指纹(fingerprint)。可以证明,只要产生随机数的算法足够好,可以保证几乎不可能有两个字符串的指纹相同,就如同不可能有两个人的指纹相同一样。由于指纹是固定的 128 位整数,因此查找的计算量比字符串比较小得多。网络爬虫在下载网页时,它将访问过的网页的网址都变成一个个信息指纹,存到哈希表中,每当遇到一个新网址时,计算机就计算出它的指纹,然后比较该指纹是否已经在哈希表中,来决定是否下载这个网页。这种整数的查找比原来字符串查找,可以快几倍到几十倍。
    产生信息指纹的关键算法是伪随机数产生器算法(prng)。最早的 prng 算法是由计算机之父冯诺伊曼提出来的。他的办法非常简单,就是将一个数的平方掐头去尾,取中间的几位数。比如一个四位的二进制数 1001(相当于十进制的9),其平方为 01010001 (十进制的 81)掐头去尾剩下中间的四位 0100。当然这种方法产生的数字并不很随机,也就是说两个不同信息很有可能有同一指纹。现在常用的 MersenneTwister 算法要好得多。

    信息指纹的用途远不止网址的消重,信息指纹的的孪生兄弟是密码。信息指纹的一个特征是其不可逆性, 也就是说,无法根据信息指纹推出原有信息,这种性质, 正是网络加密传输所需要的。比如说,一个网站可以根据用户的Cookie 识别不同用户,这个 cookie 就是信息指纹。但是网站无法根据信息指纹了解用户的身份,这样就可以保护用户的隐私。在互联网上,加密的可靠性,取决于是否很难人为地找到拥有同一指纹的信息, 比如一个黑客是否能随意产生用户的 cookie。从加密的角度讲 MersenneTwister,算法并不好,因为它产生的随机数有相关性。

    互联网上加密要用基于加密伪随机数产生器(csprng)。常用的算法有 MD5 或者 SHA1 等标准,它们可以将不定长的信息变成定长的 128 二进位或者 160 二进位随机数。值得一提的事,SHA1 以前被认为是没有漏洞的,现在已经被中国的王小云教授证明存在漏洞。但是大家不必恐慌, 因为这和黑客能真正攻破你的注册信息是还两回事。


    应用

    集合相同的判定

    比如“中关村 北京 星巴克”与“星巴克 中关村 北京”用词完全相同,但次序不一样,但如何判断两者是否完全相同呢?
    一种最笨的方法是集合A中所有元素与集合B中所有元素进行对比,这样的运算时间复杂度为O(n2);另一种方法是将两个集合中的元素进行排序,然后一一对照,计算的时间复杂度为O(nlog(n));还有一种是将第一个集合放在一张散列表中,然后把第二个集合的元素意义和散列表中的作对比,时间复杂度为O(n),但是额外使用了O(n)的空间。
    比较完美的方案是将集合中的元素对应的指纹相加,比较指纹和是否相等,比如检测网络上歌曲是否盗版,可以算一下这两个音频文件的信息指纹即可。

    判定集合基本相同

    在上面的基础上,引入随机抽样的方法,选择几个进行指纹和计算,如果相等,则在一定程度上说明重复。比如用于判断一篇文章是否抄袭,可以将文章切成小片,挑选片段的特征词集合,计算指纹和比较,根据时间先后找到原创和抄袭。

    YouTube反盗版

    视频是否为盗版,如果直接比较两段视频将会死人的。视频匹配有两个核心技术,关键帧的提取和特征的提取。然后用一组信息指纹来表示这些关键帧,从而判定是否为盗版。google采用了一种非常有趣的广告分成策略:所有视频都可以插入广告,但广告的收入全部提供给原创,这样就打击了视频盗版。

    信息指纹重复的可能性

    以MD5指纹纹理,128位二进制,每一千八百亿亿次才重复一次。重复的可能性越小,信息指纹的可靠性越高。

    相似哈希

    相似哈希是一种特殊的信息指纹,google在网页爬虫中使用进行下载网页排查重复。主要过程为扩展和收缩。扩展将网页中若干词的信息指纹扩展为其相应位上的实数的过程,每一位为0则减去其权重,为1则加上其权重,之后将所有的词的对应位上的实数加在一起构成网页的扩展实数表示,之后是收缩,对应位为负数则为0,对应位为正数则为1,从而收缩会二进制的信息指纹,该指纹就被称为相似哈希指纹。
    相似哈希指纹的特点是如果网页相似哈希相差较小,则相似度较高。


    2015-9-16 艺少

  • 相关阅读:
    LeetCode 79. 单词搜索(Word Search)
    LeetCode 39. 组合总和(Combination Sum)
    LeetCode 34. 搜索范围(search for a range)
    LeetCode 300. 最长上升子序列(Longest Increasing Subsequence)
    一段程序的分析——C++析构器,何时析构
    C++ 字符串, 数字 相互转化
    MFC 如何为控件关联变量
    上位机驱动开发经验之修改3个“附加”
    MFC Edit控件的使用~~
    thinkphp中AJAX返回ajaxReturn()方法分析
  • 原文地址:https://www.cnblogs.com/huty/p/8519168.html
Copyright © 2011-2022 走看看