2011-04-01 65 views
0

我正在根据其哈希代码对一些URL进行索引,并使用该哈希来检索它们。我在这件事上有两个问题:为两个不同的字符串URL获取唯一的哈希,它们实际上是相同的

  1. 你认为这是一个好方法吗?我的意思是有时候两个不同的URL可以产生相同的散列,但我似乎没有其他选择,因为URL可能很长,我需要为它们生成一个文件名。
  2. [更重要的]有时候两个不同的网址实际上是在同一个网页上(例如http://www.stackoverflow.comhttp://stackoverflow.com,有时还有%字符的网址),但我需要为这些网址生成相同的哈希码。你有什么建议?

谢谢。

+2

你基本上不知道两个URL(如上面提到的两个URL)是否指向相同的位置,至少不是没有访问这两个URL或者假设如何配置该站点。 – 2011-04-01 16:25:08

回答

0

经过大量的讨论和思考,由于没有回答完全回答我的问题,我会回答我自己的问题。重要的一点是Morten Mertner发布的评论与我的回答最接近,但我不能选择它作为答案。

  1. 除了使用散列算法,除了我以外没有其他办法。但为了减少重复的风险,我应该使用更好的算法,如SHA-2算法。
  2. 正如Morten Mertner所说,在某些情况下,所提到的URL实际上并不相同,我不能认为该网站配置正确。我能做的唯一事情就是删除书签,并使用网址的编码/解码版本。 (带/不带%字符的版本)。

感谢所有的帮助家伙。

0

基于哈希码的索引是错误的路径。哈希代码不是唯一的,并且有碰撞。如果您使用散列码进行索引,则会导致两个不相等的值最终从数据表中检索相同的映射值。

+0

那么你有什么建议?我需要根据该URL创建一个UNIQUE文件名。 – 2011-04-01 19:48:11

2

肯定不使用.NET字符串哈希码 - 不保证它会在版本之间做同样的事情(并且确实在.NET 1.1和.NET 2.0之间做了改变)。它也很有可能发生碰撞,并且非常短32位)。

如果您确实需要使用散列,请使用加密散列,因为导致冲突的可能性要小得多 - 例如,您可以使用SHA-256。请注意,加密哈希通常以二进制数据的形式工作,因此您需要首先将URL转换为字节数组,例如,与Encoding.UTF8.GetBytes(text)。这不是万无一失的,但至少“非常不可能”产生冲突。当然,由于哈希值更大,您的输出文件名也会更大。 (您需要将byte[]转换为字符串,我假设 - 我建议您使用Convert.ToBase64String)。

您的文件名真的是否有从URL派生?难道你不能只生成随机文件名(或增加一个计数器),然后存储URL和文件名之间的映射?这是一个更明智的方法海事组织 - 这是可逆的(所以你可以告诉哪个URL生成一个特定的文件)。

关于你的第二个问题 - 基本上你需要找到任何给定的URL推导规范 URL的一些方法,让所有的“等价”的URL转换为相同的规范之一,另外,这你散列或存储什么。

+0

谢谢。我已经在使用SHA-2算法。是的,对我来说文件名代表URL是非常重要的。至于第二部分,我知道我必须做这样的事情,但是有没有为此目的实施,所以我不必自己做,也请注意**效率**是非常重要的。 – 2011-04-01 20:11:33

相关问题