Как предложено в the accepted answer, Использование сжатия данных не работает, чтобы сократить URL-пути, которые уже довольно короткие.
DotNetZip имеет класс DeflateStream, который предоставляет метод статического (Shared in 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 раза. Причина в том, что шестнадцатеричный байт на самом деле является 2 символами ASCII.
Вы можете частично компенсировать это, используя base-62 вместо base-16 (hex) для представления числа. В этом случае 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 по-прежнему не является хорошим подходом. вы действительно хотите хэш-значение.
Почему? Вероятно, есть лучший способ сделать то, что вы просите. –
«Почему», безусловно, хороший ответ. Однако, как замечание, кодирование Хаффмана отлично подходит для простого сжатия текста без необходимости использования внешних библиотек и сжатия LZW. –
Возможный дубликат [Лучший алгоритм сжатия коротких текстовых строк] (http://stackoverflow.com/questions/1138345/best-compression-algorithm-for-short-text-strings) –