Come suggerito in the accepted answer, l'utilizzo della compressione dei dati non funziona per abbreviare i percorsi URL che sono già piuttosto brevi.
DotNetZip dispone di una classe DeflateStream che espone un metodo statico (Shared in VB) CompressString. È un modo a riga singola per comprimere una stringa utilizzando DEFLATE (RFC 1951). L'implementazione DEFLATE è completamente compatibile con System.IO.Compression.DeflateStream, ma DotNetZip si comprime meglio. Ecco come si potrebbe usarlo:
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);
}
}
Utilizzando quel codice, qui sono i miei risultati dei test:
original : folder1/folder2/page1.aspx
compressed : 4bcbcf49492d32d44f03d346fa0589e9a9867a89c5051500
uncompressed: folder1/folder2/page1.aspx
original : folderBB/folderAA/page2.aspx
compressed : 4bcbcf49492d7272d24f03331c1df50b12d3538df4128b0b2a00
uncompressed: folderBB/folderAA/page2.aspx
Così si può vedere l'array di byte "compresso", quando rappresentato in esadecimale, è più lungo l'originale, circa il doppio del tempo. Il motivo è che un byte esadecimale è in realtà 2 caratteri ASCII.
È possibile compensare un po 'per quello utilizzando la base-62, anziché la base-16 (esadecimale) per rappresentare il numero. In questo caso anche a-z e A-Z sono cifre, dandoti 0-9 (10) + a-z (+26) + A-Z (+26) = 62 cifre totali. Ciò ridurrebbe significativamente la produzione. Non l'ho provato ancora.
EDIT
Ok ho provato l'encoder Base-62. Accorcia la stringa esadecimale di circa la metà. Ho pensato che sarebbe tagliato al 25% (62/16 = ~ 4) Ma penso di perdere qualcosa con la discretizzazione. Nei miei test, la risultante stringa codificata in base 62 ha all'incirca la stessa lunghezza dell'URL originale. Quindi, no, usare la compressione e quindi la codifica base-62 non è ancora un buon approccio. vuoi davvero un valore hash.
Perché? C'è probabilmente un modo migliore per fare quello che stai chiedendo. –
"Perché" è sicuramente una buona risposta. Tuttavia, come nota a margine, la codifica di Huffman funziona alla grande per la semplice compressione del testo senza dover ricorrere a librerie esterne e compressione LZW. –
possibile duplicato di [Miglior algoritmo di compressione per stringhe di testo brevi] (http://stackoverflow.com/questions/1138345/best-compression-algorithm-for-short-text-strings) –