mag*_*ger 3 math friendly-url numbers
我想为200万资产制作一个简短的URL服务,但我想使用最短数量的可能字符.
我需要用什么来计算它的数学方程式?我知道它与阶乘有关,对吧?
jhe*_*ngs 11
这不是一个因子问题,而是一个指数问题.
如果x是可能的字符数,则需要求解以下等式y:
x^y = 2000000
Run Code Online (Sandbox Code Playgroud)
如果要使用所有数字和区分大小写的alpha [0-9A-Za-z],则有62个可能的值.这意味着你需要解决:
62^y = 2000000
y*log(62) = log(2000000)
y = log(2000000) / log(62)
y = 3.5154313828...
Run Code Online (Sandbox Code Playgroud)
当然,您的URL中不能包含3.5个字符,因此您需要4.如果要更改用于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
Run Code Online (Sandbox Code Playgroud)
而且,正如你所说,3.5个字符是不可能的,因此需要4个字符.无可否认,在这种情况下,差异无关紧要.但是,在某些情况下(特别是在处理基数2时),这非常重要.