Как предлагается в принятом ответе, использование сжатия данных не работать над сокращением уже довольно коротких URL-путей.
DotNetZip имеет класс DeflateStream, который предоставляет статический (общий в VB) CompressString. Это однострочный способ сжатия строки с помощью DEFLATE (RFC 1951). Реализация DEFLATE полностью совместима с System.IO.Compression .DeflateStream, но DotNetZip сжимает лучше. Вот как это можно использовать:
string[] orig = {
"folder1/folder2/page1.aspx",
"folderBB/folderAA/page2.aspx",
};
public void Run()
{
foreach (string s in orig)
{
System.Console.WriteLine("original : {0}", s);
byte[] compressed = DeflateStream.CompressString(s);
System.Console.WriteLine("compressed : {0}", ByteArrayToHexString(compressed));
string uncompressed = DeflateStream.UncompressString(compressed);
System.Console.WriteLine("uncompressed: {0}\n", uncompressed);
}
}
Используя этот код, вот мои результаты тестов:
original : folder1/folder2/page1.aspx
compressed : 4bcbcf49492d32d44f03d346fa0589e9a9867a89c5051500
uncompressed: folder1/folder2/page1.aspx
original : folderBB/folderAA/page2.aspx
compressed : 4bcbcf49492d7272d24f03331c1df50b12d3538df4128b0b2a00
uncompressed: folderBB/folderAA/page2.aspx
Таким образом, вы можете видеть, что «сжатый» байтовый массив, представленный в шестнадцатеричном формате, длиннее оригинала, примерно в 2 раза больше. Причина в том, что шестнадцатеричный байт на самом деле состоит из двух символов ASCII.
Вы можете немного компенсировать это, используя base-62 вместо base-16 (шестнадцатеричный) для представления числа. В этом случае a-z и A-Z также являются цифрами, что дает вам 0-9 (10) + a-z (+26) + A-Z (+26) = всего 62 цифры. Это значительно сократит вывод. Я этого не пробовал. пока что.
РЕДАКТИРОВАТЬ
Хорошо, я протестировал кодировщик Base-62. Он укорачивает шестигранную строку примерно наполовину. Я подумал, что это сократит его до 25% (62/16 = ~ 4), но я думаю, что я что-то теряю с дискретизацией. В моих тестах результирующая строка в кодировке base-62 примерно такой же длины, как и исходный URL. Итак, нет, использование сжатия и затем кодирования base-62 по-прежнему не является хорошим подходом. вам действительно нужно хеш-значение.
29.01.2010