Zgodnie z sugestią podaną w artykule the accepted answer, użycie kompresji danych nie działa na rzecz skracania ścieżek adresów URL, które są już dość krótkie.
DotNetZip ma klasę DeflateStream, która udostępnia metodę statyczną (Udostępnione w VB): CompressString. Jest to jednoliniowy sposób kompresji ciągu znaków przy użyciu DEFLATE (RFC 1951). Implementacja DEFLATE jest w pełni kompatybilna z System.IO.Compression.DeflateStream, ale DotNetZip kompresuje lepiej. Oto w jaki sposób można go używać:
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);
}
}
Używając tego kodu, oto wyniki moich badań:
original : folder1/folder2/page1.aspx
compressed : 4bcbcf49492d32d44f03d346fa0589e9a9867a89c5051500
uncompressed: folder1/folder2/page1.aspx
original : folderBB/folderAA/page2.aspx
compressed : 4bcbcf49492d7272d24f03331c1df50b12d3538df4128b0b2a00
uncompressed: folderBB/folderAA/page2.aspx
Więc można zobaczyć „skompresowany” tablicę bajtów, gdy reprezentowana w hex, jest dłuższy niż oryginał, około 2 razy dłuższy. Powód jest taki, że bajt szesnastkowy to właściwie 2 znaki ASCII.
Można to w pewnym stopniu skompensować, używając base-62, zamiast base-16 (hex) do przedstawienia liczby. W takim przypadku a-z i A-Z są również cyframi, co daje 0-9 (10) + a-z (+26) + A-Z (+26) = 62 całkowite cyfry. To znacznie skróciłoby produkcję. Nie próbowałem tego. jeszcze.
EDIT
Ok testowane baza-62 kodera. Skraca łańcuch szesnastkowy o około połowę. Pomyślałem, że zmniejszy to do 25% (62/16 = ~ 4), ale myślę, że tracę coś z dyskretyzacją. W moich testach wynikowy łańcuch zakodowany w bazie 62 jest mniej więcej tej samej długości co pierwotny URL. Zatem nie, używanie kompresji, a następnie kodowania base-62 nadal nie jest dobrym podejściem. naprawdę potrzebujesz wartości hash.
Dlaczego? Prawdopodobnie jest lepszy sposób robienia tego, o co prosisz. –
"Dlaczego" jest z pewnością dobrą odpowiedzią. Jednak, na marginesie, kodowanie Huffmana działa doskonale dla prostej kompresji tekstu bez konieczności uciekania się do zewnętrznych bibliotek i kompresji LZW. –
możliwy duplikat [najlepszego algorytmu kompresji dla krótkich łańcuchów tekstowych] (http://stackoverflow.com/questions/1138345/best-compression-algorithm-for-short-text-strings) –