Кодирование строки [0-9] в [0-9a-zA-Z] строку
Идея такая: есть строка, полностью состоящая из символов цифр (0-9). Хочу закодировать ее в строку поменьше (и безопаснее) для передачи get параметром, используя символы (0-9a-zA-Z), и иметь возможность раскодировать.
Нашел решение
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;
}
но тут используется long вместо string, а у меня количество символов не фиксированное и легко может быть больше 100. В дальнейшем это решение мне нужно будет адаптировать на java, swift и php.
Ответы (1 шт):
Прикол в том, что при переводе вы не сильно сократите строку.
На 100 символов:
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 - основание 10, 100 символов.
2hqbczu2ow52bala8lgc3s5y9mm5tiy0vo9tke25466gfi6ax8gs22x7kuu8l1tdr - основание 36, 65 символов.
26:12:60:57:53:34:2:22:19:49:26:15:16:47:30:17:29:12:10:9:5:33:61:8:10:17:24:53:21:56:50:18:24:0:41:56:25:46:17:17:12:38:60:33:60:9:60:55:22:5:23:1:47:52:54:35 - основание 62, 56 символов.
Как видите, основание 62 не сильно укоротило строку, но зато добавило кучу новых символов.
При 100 различных символах в записи вы получите строку в 2 раза короче - 50 симв.
Наиболее оптимальное соотношение длины к кол-ву используемых различных символов связано с числом Эйлера - 2,71... Наиболее "компактная" с-ма счисления имеет основание е, а в вашем случае продуктивнее всего использовать основание 27 или 271. Но с оглядкой на символы и само программирование, удобнее 32 или 36 и 256, соответственно. 32 и 256 - т.к. это степени 2-ки, а 36 - кол-во символов [0-9a-z]. Если же комп оперирует тритами или работает на троичной логике, то 27 - идеально. ))
Секюрность таким способом вы тоже не особо поднимете.
Просто возьмите готовый шифровальщик, если нужно зашифровать что-то, или же, если прет что-то повелосипедить, то придумайте сами какое-то взаимно однозначное соответствие 10 <-> 62.