我的问题是关于验证比什么都重要。什么可以用来确定 HTML 文档中的唯一性?(文档可以具有一定程度的动态性。)
考虑到您可以存储您正在验证的各种页面的“指纹”,可以使用或生成什么来识别页面是正确的页面,准确率可以达到 99%?
为清楚起见,这是对加密/https 等的额外附加。此页面可以并且将根据特定用户随动态内容而变化,但是指纹也可以,但由于性质,单个指纹不能 100% 匹配 100% 的用户的动态内容。因此散列不能在这里工作,至少不能以简单的形式工作。
我的问题是关于验证比什么都重要。什么可以用来确定 HTML 文档中的唯一性?(文档可以具有一定程度的动态性。)
考虑到您可以存储您正在验证的各种页面的“指纹”,可以使用或生成什么来识别页面是正确的页面,准确率可以达到 99%?
为清楚起见,这是对加密/https 等的额外附加。此页面可以并且将根据特定用户随动态内容而变化,但是指纹也可以,但由于性质,单个指纹不能 100% 匹配 100% 的用户的动态内容。因此散列不能在这里工作,至少不能以简单的形式工作。
HTML 页面的唯一指纹很容易计算。从以下内容构建哈希:
可选的一些标题:
Server
Content-Type
这个很重要Content-encoding
这可能也是这假设您没有将任何数据发布到页面。
如果您不检查主机的 IP,您甚至无法确定 1%。接下来是加密。(如果没有这个,您可能会成为 ARP 中毒的受害者(仅在 lan 网络中))。
HTTPS 中的密钥必须始终相同。
如果它发生变化,则意味着有人在作弊或密钥已更新(密钥有到期日期。)
页面的指纹是主机名、端口和路径。这是唯一保证在网络上独一无二的东西。我想您还可以包含缓存标头(Last-Modified)以查看它是否已更改。
最重要的是,如果您对 html 进行哈希处理,即使最后修改的标头发生了变化,您也可以看到它是否发生了变化。
假设您想存储 HTML 页面的“指纹”,以便稍后在完全匹配时识别它,只需使用 HTML 页面的简单哈希摘要。
除非您进一步澄清问题,否则我看不出为什么它是 HTML 或它所在的浏览器很重要。
但是,这不会告诉您页面是否位于同一位置。为此,您需要存储其他详细信息,例如主机/IP 和路径。
如果您可以获得两个页面的文本版本,您可以区分它们。您可以确定页面差异可接受的最大范围。
有一个 Unix 实用程序(称为 diff)。网上也有这个工具的win32版本。维基百科有一篇关于 diff 的文章:http ://en.wikipedia.org/wiki/Diff 。
wiki 文章列出了免费的文件比较工具,“另请参阅”部分包含其他讨论文件比较工具和 delta 编码的文章的链接。
“Levenshtein 距离度量”也可能是一种有趣的方法。
CodeProject 上有一个不错的 C# 差异引擎。由于我的低分,我无法发布另一个链接,但文章标题是:“C# 中的通用、可重用差异算法”。
即使您有确切的主机名、端口和路径,如果有一个应用程序服务器为网页提供服务或网络服务器正在插入广告内容,内容仍然可能有所不同。
如果您可以可靠地识别动态的 HTML 部分(例如不断更新的广告或时间戳),那么我将首先对数据进行规范化。我会删除所有空格字符(空格、制表符、换行符),然后对该内容进行哈希处理。
我不会在哈希中包含主机名端口路径,因为这不会向“指纹”添加任何内容。(当您稍后必须重新查询 Web 服务器以比较 HTML 时,该信息很有用。)