我希望独特地缩短字符串文件ID以便在URL中使用,例如bit.ly等。我可以使用数据库中的ID,但我希望网址是随机的。
什么是最好的解决方案?
网站将成为一个移动网站,所以我希望它尽可能短
答案 0 :(得分:6)
你无法“唯一缩短”任意字符串。鸽笼原则和所有。
你想做什么(以及AFAIK的缩短服务做什么)是保存提交的所有内容的数据库,以及使用的短字符串。然后你可以在数据库中查找。
您可以通过简单地增加一个数字和Base64编码来生成短字符串。
答案 1 :(得分:5)
有两种方法可以实现像您描述的那样的映射服务。
客户提交全球唯一标识
据我所知,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]个不同的值。这是一个相当大的领域。 *
然后它成为返回给定提交的值的问题。可能有很多方法可以做到这一点,但我会选择这样的东西,
增强或优化可能包括
<强>结论强>
底线是,你想保证唯一性 - 所以碰撞是一个很大的禁忌。
* = 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个字符)。
希望这有帮助。