c#缩短url的字符串

时间:2010-01-12 21:08:34

标签: c# bit.ly url-shortener

我希望独特地缩短字符串文件ID以便在URL中使用,例如bit.ly等。我可以使用数据库中的ID,但我希望网址是随机的。

什么是最好的解决方案?

网站将成为一个移动网站,所以我希望它尽可能短

5 个答案:

答案 0 :(得分:6)

你无法“唯一缩短”任意字符串。鸽笼原则和所有。

你想做什么(以及AFAIK的缩短服务做什么)是保存提交的所有内容的数据库,以及使用的短字符串。然后你可以在数据库中查找。

您可以通过简单地增加一个数字和Base64编码来生成短字符串。

答案 1 :(得分:5)

有两种方法可以实现像您描述的那样的映射服务。

  1. 客户提交全球唯一ID,或
  2. 服务器生成全局唯一ID
  3. 客户提交全球唯一标识

    据我所知,1。只应尝试使用Guid s,除非您设计类似的方法将足够不同的信息填充到短字节流中。无论哪种方式,如果您有一个表示全局唯一标识符的字节流,您可以执行类似这样的操作

    // source is either a Guid, or some other globally unique byte stream
    byte[] bytes = Guid.NewGuid ().ToByteArray ();
    string base64String = Convert.ToBase64String (bytes).Trim ("=");
    

    获取用户可读的字母数字字符串,该字符串看起来是随机的,但避免了其他随机方案中固有的冲突。 Guid包含16个字节或128位,对于完整的Base64编码,转换为大约19个字符。

    这种方法的优点是客户可以在没有中央权限的情况下生成自己的小Uris。如果你使用Guid滚动,或者实现你自己的全局唯一字节流 - 让我们面对它 - 容易出错,那么缺点就是长度很大。

    如果您选择这条路线,请考虑使用Google全球唯一字节流等。哦,远离随机字节,否则你将不得不建立碰撞分辨率 ON TOP OF 你的小型Uri发生器。

    服务器生成全局唯一ID

    同样,上述的主要优点是客户可以生成他们的Uris 先验。如果您要提交要查看的长时间运行请求,请特别方便。这可能与您的情况无关,并且可能仅提供有限的价值。

    因此,除此之外,以服务器为中心的方法,其中单个权威机构生成并发出ID可能更具吸引力。如果这是你选择的路线,那么唯一的问题是你想要你的Uri多久?

    假定所需长度为5个字符,假设您使用Base64编码,每个id最多可表示5个字符,每个字符7位等于35位或2 ^ 35 [34 359 738 368]个不同的值。这是一个相当大的领域。 *

    然后它成为返回给定提交的值的问题。可能有很多方法可以做到这一点,但我会选择这样的东西,

    • 枚举数据库中“空闲列表”中的所有可能值
    • 消费时从空闲列表中删除值
    • 发布时将值添加到空闲列表

    增强或优化可能包括

    • 不要枚举范围[0,2 ^ 35]上的每个值,而是枚举一个可管理的子集,一次说100 000个值,并且当所有值都被消耗时,只需按顺序生成另外100 000个值并继续< / LI>
    • 为值添加到期日期,并在当天结束时回收过期值
    • 分发您的服务,在并行化服务时,只需将空闲列表的小型互斥子集发送到分布式服务

    <强>结论

    底线是,你想保证唯一性 - 所以碰撞是一个很大的禁忌。


    * = 34 359 738 368是原始域的大小,这是0长度到5长度的所有ID。如果您有兴趣将所有ID限制为最小和最大长度为5,那么您的域看起来像所有长度为0到5(2 ^ 35)的ID,所有长度为0到4(2 ^ 28)的ID都是2 ^ 35 - 2 ^ 28 = 34 091 302 912,仍然非常大:)

答案 2 :(得分:0)

存储随机的字母数字字符串,并将其用于您的短网址。将您认为最适合您网站及其用户的长度设为www.yoursite.com/d8f3

答案 3 :(得分:0)

您可以使用哈希(例如CRC32)来生成相当短的URL。在减少数据时,您永远无法获得“唯一”网址,因此必须存在冲突。

答案 4 :(得分:-2)

嘿,正如其他几个人告诉过你的那样..如果你开始将网址压缩成小的东西,你就不可能保持它的独特性。也就是说,您需要为提交给您的每个网址制作自己的编码。一种方法(简单)是,尝试从提交的URL创建一个数据库,然后为每个生成一个guid字段,然后从中获取一个子字符串,确保每次注册时都与前一个完全不同。

例如:www.google.com使用guid F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4 - &gt; http://www.mysite.com/?q=CEB2

随着您使用的字符越来越多,您可以跟踪更多的链接。对于此示例,您将拥有65536个不同的链接(十六进制中只有4个字符)。

希望这有帮助。