-1

我正在尝试在 c# 和 asp.net mvc 中创建一个 url 缩短系统。我知道哈希表,我知道如何创建重定向系统等。问题是在数据库中索引长 url。一些 url 可能有多达 4000 个字符长度,索引这种字符串似乎是个坏主意。问题是:如何为每个 url 创建一个唯一的短字符串?例如 MD5 可以帮助我吗?MD5 对于每个字符串真的是唯一的吗?

注意:我看到 Gravatar 对电子邮件使用 MD5,所以如果每个电子邮件地址都是唯一的,那么它的 MD5 哈希值也是唯一的。这样对吗?我可以对网址使用相同的解决方案吗?

4

4 回答 4

2

您可以将 MD5 或 SHA1 用于您描述的目的。

哈希并不是完全唯一的。例如,如果您有 4000 字节数组,这意味着您可能有 256^4000 组合。而 MD5 将有 256^16 组合。所以,有碰撞的可能。但是,出于所有实际目的(密码学除外),您不必担心冲突。

如果您对 MD5 的碰撞漏洞(与加密使用相关)感兴趣,可以在这里进行

于 2012-09-08T15:38:39.767 回答
0

已经提到的散列方法可以很好地创建可能唯一标识您的 URL 的唯一短字符串。但是,我想提出一种替代方法。

创建一个包含两列 ID(整数)和 URL(字符串)的数据库表。在表格中为您要跟踪的每个 URL 创建一行。然后,通过 ID 引用每个 URL。使 ID 自动递增,这将确保唯一性。

这解决了如何从缩短版本转换为更长版本的问题:只需连接数据库中的表。使用散列,这将成为一个问题,因为散列是单向的。生成的页面标识符也将比 MD5 哈希值短,并且仅包含数字,因此它们很容易包含在 URL 查询字符串等中。

于 2012-09-08T15:43:41.263 回答
0

完美的散列函数是保证没有冲突的函数。由于您的应用程序无法容纳散列链,因此完美的散列是要走的路。

于 2012-09-08T18:24:33.217 回答
-1

我认为你可以尝试从 url 字符串中创建一个字节(每个字符可以是一个字节)数组,然后使用编码(例如 Base64,或者如果你想走那么远你可以自己创建一个),然后如果你想要要解码,您只需使用 base 64 解码并再次从字节(在数组中)制作字符。但是我不确定这是否会是一个长字符串,但我很确定它会是独一无二的。

(PS 你应该先应用一些逻辑,比如总是删除 http://,然后在解码时再次添加)

于 2012-09-08T15:44:21.447 回答