我正在根据哈希代码索引一些URL,并使用此哈希来检索它们。我在这件事上有两个问题:
感谢。
答案 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发布的评论与答案最接近,但我不能选择它作为答案。
感谢所有帮助人员。