【发布时间】:2013-11-30 10:57:09
【问题描述】:
我正在实现一个爬虫,我想为我的系统爬取的每个 URL 生成一个唯一的哈希码。这将帮助我检查重复的 URL,匹配完整的 URL 可能是一件昂贵的事情。 Crawler 每天将抓取数百万页。所以这个哈希函数的输出应该是唯一的。
【问题讨论】:
-
为什么不直接使用 HashMap?
标签: java hash web-crawler
我正在实现一个爬虫,我想为我的系统爬取的每个 URL 生成一个唯一的哈希码。这将帮助我检查重复的 URL,匹配完整的 URL 可能是一件昂贵的事情。 Crawler 每天将抓取数百万页。所以这个哈希函数的输出应该是唯一的。
【问题讨论】:
标签: java hash web-crawler
除非您提前知道每个地址,并且对于所述地址集恰好有一个完美的哈希值,否则这个任务在理论上是不可能的。
根据鸽巢原理,无论您使用什么技术进行转换,都必须至少存在两个具有相同Integer 值的字符串,因为Integers 具有有限范围,而字符串则没有。虽然地址实际上不是无限长的,但您仍然会获得映射到相同哈希值的多个地址。理论上,有无数个字符串会映射到相同的Integer 值。
因此,总而言之,您可能应该只使用标准的HashMap。
此外,您还需要担心以下几点:
www.stackoverflow.com
http://www.stackoverflow.com
http://stackoverflow.com
stackoverflow.com
...
它们都是等价的,所以你需要先规范化,然后散列。虽然有些算法首先给出集合会生成完美的哈希,但我怀疑这对于您的目的是否必要。
【讨论】:
我认为解决方案是首先规范化 URL,方法是从开头删除像 http:// 或 http://www. 这样的第一部分和像 / 或 ?... 或 #... 这样的最后部分。
清理之后,你应该有一个干净的域 URL,你可以为它做一个哈希。
但最好的解决方案是使用布隆过滤器(一种概率数据结构),它可以告诉您该 URL 可能访问过或保证未访问过
【讨论】: