什么是完美的哈希fn。数十亿网址的最小尺寸哈希?

时间:2010-12-28 08:36:20

标签: .net url hash

索引1000亿个URL以及具有完美功能且无冲突的功能。由于URL是唯一的字符串,我想任何字符串哈希函数。像MD5一样好,但需要专家的意见。

此外,我们希望通过哈希搜索URL集(截至目前的DB表),因此显然更短的哈希将在搜索时间和空间中有效。

我可以指定固定的哈希长度吗?

我们正在使用C#.NET 4.0

1 个答案:

答案 0 :(得分:2)

你确定你的数据库表不是要走的路吗?这对哈希函数有很多要求。大多数哈希函数都不允许您设置哈希的长度,并且要求哈希完美地进一步缩小哈希值。你需要所有这些要求吗?更有可能的是,一个更简单的解决方案也可以正常工作。

你是在读磁盘吗? (1000亿个URL,假设一个域的URL长度为4,“。com”+“/”+ 4更多=每个URL 12个字节= 1.09 TiB - 这是一个非常保守的估计。)你可能想要研究更友好的磁盘结构,例如B-Trees(及其衍生产品,如B + -trees) - 这些数据结构提供了有效的(理论上是log(n),但在某些常见情况下可以击败散列表)查找,删除,插入。数据库通常将这些用于哈希的索引,这应该提供有关其性能的提示。 (这让我回到最初的问题:你确定你的数据库表不是要走的路吗?)

如果您使用哈希,即使有冲突的哈希也会有效。像SHA256这样的东西,虽然计算成本相对较高,但碰撞率可以接受。 (我相信它太低了,你更容易被闪电击中。多次。人们使用UUID而不用担心碰撞,它的位数不到SHA256哈希的一半。)SHA256的CPU成本如果您打算通过磁盘访问来跟进它,可能无关紧要。

(另外:您的DB数据库表是否已正确编入索引,以便在该字段上快速搜索?)