我正在尝试在c#和asp.net mvc中创建一个url缩短系统。我知道哈希表,我知道如何创建重定向系统等。问题是索引数据库中的长URL。有些网址可能长达4000个字符,而且索引此类字符串似乎是一个坏主意。问题是:如何为每个URL创建一个唯一的短字符串?例如MD5可以帮助我吗? MD5对于每个字符串是否真的独一无二?
注意:我看到Gravatar使用MD5作为电子邮件,因此如果每个电子邮件地址都是唯一的,那么其MD5散列值是唯一的。这样对吗?我可以为网址使用相同的解决方案吗?
答案 0 :(得分:2)
您可以将MD5或SHA1用于所描述的目的。
哈希并非完全独特。例如,如果你有4000个字节的数组,那就意味着你可能有256 ^ 4000个组合。而MD5将拥有256 ^ 16组合。所以,有可能发生碰撞。但是,出于所有实际目的(加密除外),您永远不必担心冲突。
如果您对MD5的碰撞漏洞(与密码使用相关)感兴趣,可以这样做here
答案 1 :(得分:0)
已经提到的散列方法可以很好地创建可能唯一标识您的URL的唯一短字符串。但是,我想提出一种替代方法。
创建一个包含两列的数据库表,ID(整数)和URL(字符串)。在表格中为您要跟踪的每个网址创建一行。然后,按ID查阅每个URL。使ID自动递增,这将确保唯一性。
这解决了如何从缩短版本转换为更长版本的问题:只需加入数据库中的表。使用散列,这将成为一个问题,因为散列是单向的。生成的页面标识符也将短于MD5哈希值,并且只包含数字,因此它们很容易包含在URL查询字符串等中。
答案 2 :(得分:0)
我认为你可以尝试从url字符串中创建一个字节(每个char可以是一个字节)数组,然后使用编码(例如,Base64,或者如果你想去那么远,你可以自己创建一个),然后如果你想解码你只需使用base 64解码并从字节(在数组中)再次制作chars。但是我不确定或者这将是一个很长的字符串,但我很确定它将是独一无二的。
(PS你应该首先应用一些逻辑,比如总是删除http://并在解码后再添加它)
答案 3 :(得分:0)
perfect hash function是一个保证不发生碰撞的人。由于您的应用程序无法容纳哈希链,因此可以使用完美的哈希值。