【发布时间】:2010-12-11 23:57:29
【问题描述】:
我想为 200 万个资产创建一个短 URL 服务,但我想使用尽可能短的字符数。
我需要使用什么数学方程式来计算它?我知道这与阶乘有关,对吧?
【问题讨论】:
标签: math numbers friendly-url
我想为 200 万个资产创建一个短 URL 服务,但我想使用尽可能短的字符数。
我需要使用什么数学方程式来计算它?我知道这与阶乘有关,对吧?
【问题讨论】:
标签: math numbers friendly-url
你通常可以在没有任何数学魔法的情况下解决这类问题。
26+26+10 = 62 个字符
Try 1. 62 = 62
Try 2. 62*62 = 3,844
Try 3. 62*62*62 = 238,328
Try 4. 62*62*62*62 = 14,776,336
所以 4 是你的答案 :)
【讨论】:
这不是阶乘问题,而是指数问题。
如果x 是可能的字符数,则需要解出y 的以下等式:
x^y = 2000000
如果您想使用所有数字和区分大小写的字母 [0-9A-Za-z],您有 62 个可能的值。这意味着你需要解决:
62^y = 2000000
y*log(62) = log(2000000)
y = log(2000000) / log(62)
y = 3.5154313828...
当然,您的 URL 中不能有 3.5 个字符,所以您需要 4 个。如果您想更改用于 URL 的字符集,只需使用您的 URL 中的值的数量来解决上述问题设置。
注意 求解这个等式假定 URL 是固定长度的。对于可变长度 URL,请参阅 Rob 的回答。
【讨论】:
@jheddings 很接近,并且得到了正确的答案,但数学并不完全正确。不要忘记您不限于特定长度的字符的所有排列。您还可以利用长度为 1 到 y 个字符的 URL。因此我们想要这个总和的闭合值:
x + x^2 + x^3 + ... + x^y = 2000000
幸运的是,这个总和有一个封闭的形式:
x + x^2 + x^3 + ... + x^y = x*(x^y - 1)/(x-1) = 2000000
x 是我们范围内可能的字符数。为简单起见,我们假设它只包含小写、大写和数字(26+26+10 = 62。)
那么我们得到以下等式:
2000000 = (62^(y+1) - 62)/(62-1)
2000000 = (62^(y+1) - 62)/(61)
2000000 * 61 = 62^(y+1) - 62
122000000 = 62^(y+1) - 62
122000000 + 62 = 62^(y+1)
122000062 = 62^(y+1)
log(122000062) = (y+1)
log(122000062) / log(62) = y+1
4.511492 = y+1
3.511492 = y
而且,正如你所说,3.5 个字符是不可能的,所以需要 4 个。诚然,在这种情况下,差异并不重要。但是,在某些情况下(尤其是在处理 base 2 时)它非常重要。
【讨论】:
根据 HTTP/URI 规范,您还可以使用以下“未保留字符”:ALPHA / DIGIT / "-" / "." /“_”/“~”
这会为您的基数添加额外的 4 个字符,因此
Math.log(2000000) / Math.log(66) = 3.4629721616408813
尽管这仍然意味着您最终会得到一个最多 4 个字符的 URL 路径。
【讨论】:
您需要回答一些问题,例如您希望在您的系列中允许哪些类型的角色。
所有字母和所有数字?基数 36(5 个字符可以容纳 2mil+)
区分大小写?这使您可以使用 62 个基数(4 个字符)
删除容易出错的字符和数字(例如 i/l 0/o)?大约 32 个基数(也是 5 个字符)
【讨论】:
可能的短 URL 数 =(ID 中可能的不同字符数)的(URL 中 ID 的长度)的幂
例如,如果您只使用小写字符(其中有 26 个)并且您的网址看起来像 http://domain.com/XXXXX(对于您的 5 个字符的唯一 ID),那么您可以制作 26^5 = 11,881,376 个短网址.
如果您使用大小写字母,则有 52 个,因此 52^5 = 380,204,032 个可能的短 URL,等等。
【讨论】: