获取实际上相同的两个不同字符串URL的唯一哈希

时间:2011-04-01 16:18:16

标签: c# .net string url hash

我正在根据哈希代码索引一些URL,并使用此哈希来检索它们。我在这件事上有两个问题:

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

3 个答案:

答案 0 :(得分:2)

绝对不使用.NET字符串哈希代码 - 不能保证它在版本之间做同样的事情(并且确实在.NET 1.1和.NET 2.0之间进行了更改)。它也很可能发生冲突,并且非常短32位。

如果你真的必须使用哈希,那么使用加密哈希就不太可能导致冲突 - 例如,你可以使用SHA-256。请注意,加密哈希通常在二进制数据方面起作用,因此您需要首先将URL转换为字节数组,例如与Encoding.UTF8.GetBytes(text)。这不是万无一失的,但它至少“非常不可能”产生碰撞。当然,由于哈希值相当大,输出文件名也会更大。 (您还需要将byte[]转换为字符串,我假设 - 我建议您使用Convert.ToBase64String)。

你的文件名确实来自网址吗?难道你不能只生成随机文件名(或增加一个计数器),然后在某处存储URL和文件名之间的映射?这是一种更明智的方法IMO - 它是可逆的(所以你可以告诉哪个URL生成了一个特定的文件)。

关于你的第二个问题 - 基本上你需要找到一种从任何给定的URL派生规范 URL的方法,以便所有“等效”的URL都转换为相同的规范URL。 ..那就是你散列或存储的东西。

答案 1 :(得分:0)

基于哈希码的索引是一个bug的路径。散列码不是唯一的并且确实存在冲突。如果您对哈希代码进行索引,则会导致两个不相等的值最终从数据表中检索相同的映射值。

答案 2 :(得分:0)

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

  1. 除了使用哈希算法之外,没有别的办法。但是为了降低重复的风险,我应该使用更好的算法,比如SHA-2。
  2. 正如Morten Mertner所说,在某些情况下,提到的URL实际上并不相同,我不能假设网站配置正确。我唯一能做的就是删除书签,并使用URL的ecoded / decode版本。 (带/不带%字符的版本)。
  3. 感谢所有帮助人员。