c#缩短url的字符串

nLL*_*nLL 6 c# bit.ly url-shortener

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

什么是最好的解决方案?

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

Ano*_*on. 6

你不能"唯一地缩短"任意字符串.鸽笼原理和所有.

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

您可以通过简单地递增一个数字来生成短字符串,并且每次都对其进行Base64编码.

  • 这就是数据库的设计目标. (8认同)

joh*_*y g 5

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

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

客户提交全球唯一ID

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

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

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

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

如果你选择这条路线,可以考虑使用Google全球唯一的字节流等.哦,STAY AWAY FROM随机字节,否则你将要兴建的冲突解决在上面的你的小URI生成.

服务器生成全局唯一ID

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

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

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

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

  • 枚举数据库中"空闲列表"中的所有可能值
  • 消费时从空闲列表中删除值
  • 释放时将值添加到空闲列表

增强或优化可能包括

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

结论

最重要的是,你想要保证唯一性 - 所以碰撞是一个很大的禁忌.


*= 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,仍然相当大:)