我有一串数字,我想缩短它以在 URL 中使用。该字符串始终仅由数字组成。例如:9587661771112
理论上,将数字字符串加密为字母数字(0-9a-zA-Z)字符串应该总是返回更短的结果,这就是我想要的。
我创建了一个执行以下操作的算法:
加密(string1 = 数字输入字符串,string2 = 字母数字返回字符串)
- 从 string1 中取出接下来的两个字符并将它们转换为一个数字,例如上面例子中的 95
- 检查数字是否小于 52(az 和 AZ 的组合长度)
- 如果是这样,将 ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")[Number] 添加到 string2 并向前跳转 2 个字符
- 否则,将 ("0123456789)[First digit of Number) 添加到 string2 并向前跳转 1 个字符
在下一步中,数字将是 58,依此类推。
通过一些调整,我能得到的最短结果是:9587661771112 > j9UQpjva
我的问题是,使用这种技术,结果可能会有很大差异。我也觉得这不是我问题的干净解决方案。
所以我需要一个加密算法,将一串数字转换成更短的大写字母、小写字母和数字串。它必须是可解密的并且具有或多或少一致的结果。
知道如何实现这一目标吗?
解决方案:
string Chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
string Base10To62(long N)
{
string R = "";
while (N != 0)
{
R += Chars[(int)(N % 62)];
N /= 62;
}
return R;
}
long Base62To10(string N)
{
long R = 0;
int L = N.Length;
for (int i = 0; i < L; i++)
{
R += Chars.IndexOf(N[i]) * (long)Math.Pow(62, i);
}
return R;
}
奇迹般有效 :)