我有一组数字,希望将其缩短以便在URL中使用。该字符串始终仅包含数字。例如:9587661771112。
理论上,将数字字符串加密成字母数字字符(0-9a-zA-Z)应始终返回更短的结果,这正是我想要的。
我创建了一个算法,它执行以下操作:
加密(string1 = 数字输入字符串,string2 = 字母数字返回字符串) - 从string1中获取下两个字符并将其转换为数字,例如,对于上面的示例,“95”。 - 检查数字是否小于52(a-z和A-Z的组合长度) - 如果是,则添加("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")[Number]到string2,并跳过2个字符 - 否则,将("0123456789)[Number的第一个数字]添加到string2,并跳过1个字符
接下来的步骤中数字变为了“58”等等。
经过一些调整,我得到的最短结果是:9587661771112 > j9UQpjva。
我的问题是,使用这种技术,结果可能会有很大的差异。我还觉得这不是我问题的干净解决方案。
因此,我需要一种加密算法,将数字字符串转换为较短的大写字母、小写字母和数字字符串。它必须可解密且具有比较一致的结果。
有什么想法如何实现吗?
运作得很好 :)
理论上,将数字字符串加密成字母数字字符(0-9a-zA-Z)应始终返回更短的结果,这正是我想要的。
我创建了一个算法,它执行以下操作:
加密(string1 = 数字输入字符串,string2 = 字母数字返回字符串) - 从string1中获取下两个字符并将其转换为数字,例如,对于上面的示例,“95”。 - 检查数字是否小于52(a-z和A-Z的组合长度) - 如果是,则添加("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")[Number]到string2,并跳过2个字符 - 否则,将("0123456789)[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;
}
运作得很好 :)