【问题标题】:Creating unique URLs in ASP.NET在 ASP.NET 中创建唯一的 URL
【发布时间】:2011-02-17 04:27:35
【问题描述】:

在我的网站中,我需要创建管理员用户用来将其发送给一组用户的唯一 URL。每当管理员创建新表单时,都会创建唯一 URL。我知道我可以使用 guid 来表示唯一的 URL,但我正在寻找更短的内容(希望大约 4 个字符,因为它更容易记住)。如何在 ASP.NET 中生成如下所示的唯一 URL:

http://mydomain.com/ABCD

我了解一些 URL 缩短器网站(如 bit.ly)使用非常短的唯一 URL 来执行类似的操作。有没有我可以使用的算法?

【问题讨论】:

  • 有什么理由不能在 SQL 中使用标识列,如果您希望它们的数字始终为 4 个字符长,您可以从“1000”开始种子。这没有随机性,但听起来这不是问题。

标签: c# .net asp.net


【解决方案1】:

怎么样

public static  string GetRandomString (int length)  
{  
 string charPool = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";  
 StringBuilder sb = new StringBuilder();  
 Random rnd = new Random();

 while ((length--) > 0)  
 sb.Append(charPool[(int)(rnd.NextDouble() * charPool.Length)]);  

 return sb.ToString();  
}  

然后打电话

GetRandomString(4);

【讨论】:

  • rnd.Next(charPool.Length) 更适合随机调用。但是这种方法存在问题,它可能会多次生成相同的随机字符串,从而导致冲突。
  • 如果length > 5,在大约 46k 输出后将产生冲突,更早的长度较小。
【解决方案2】:

只需编写一个算法来从 GUID 中选择一定数量的字符(例如,前 4 或 8 个字符,每个偶数字符最多 4 或 8 个字符。)

请务必根据数据库检查它,以确保它尚未在使用中,以及是否正在重新生成它。作为安全措施,可能会超时(如果它尝试生成 10 并且它们都在使用中,请放弃),但不太可能使用所有可能的组合。

【讨论】:

    【解决方案3】:

    我相信 bit.ly 会执行哈希,然后 base64 对结果进行编码。你也可以这样做,尽管它会超过 4 个字符。请务必添加处理散列冲突的代码。您可以在使用第一个哈希时附加 1、2、3 等。

    另一种方法是在数据库中创建一个新表。每次您需要新 URL 时,请在此表中添加一行。您可以使用 PK 作为 URL 值。这将为您提供最多 10,000 个仅使用四个字符的唯一值。 Base64 编码更多。

    【讨论】:

    • 我相信你的意思是 Base 36,而不是 64 位
    • @Neil Er... 我想我实际上是指 Base 64。错误已修复。谢谢。
    • Base 64 也不起作用,因为它区分大小写,而 URL 则不。
    • @Neil 嗯,是的,这可能会破坏。但作为一个论点(它最终会像使用 URL 路由解析 URL 一样),它应该相当可靠地工作。
    猜你喜欢
    • 1970-01-01
    • 2016-12-12
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 2011-03-03
    • 2016-08-15
    相关资源
    最近更新 更多