我正在实现抓取工具,我想为系统抓取的每个URL生成唯一的哈希码。这将帮助我检查重复的URL,匹配完整的URL可能是一项昂贵的工作。抓取工具每天将抓取数百万个页面。因此,此哈希函数的输出应该是唯一的。
除非您提前知道每个地址,并且所说的地址集恰好有一个完美的哈希,从理论上讲,这项任务是不可能的。
根据信鸽原理,无论您使用哪种技术进行转换,都必须至少存在两个具有相同Integer
值的字符串,考虑到Integers
的范围是有限的,而字符串则没有。尽管实际上地址不是无限长,但是您仍将获得映射到相同哈希值的多个地址。从理论上讲,有无数个字符串将映射到相同的Integer
值。
因此,总而言之,您应该只使用标准的HashMap
。
此外,您还需要担心以下问题:
www.stackoverflow.comhttp://www.stackoverflow.comhttp://stackoverflow.com stackoverflow.com ...
都是等效的,因此您需要先进行规范化,然后再进行哈希处理。虽然有些算法首先给出集合会产生完美的哈希,但我怀疑这对于您的目的是必要的。
[我认为解决方案是首先通过从开头和结尾部分(例如http://
或http://www.
或/
)中删除第一部分(例如?...
或#...
)来规范化URL。清理之后,您应该拥有一个干净的域URL,并且可以对其进行哈希处理。
但是最好的解决方案是使用bloomfilter(概率数据结构),它可以告诉您URL是可能访问过或保证未访问过] >>