Compression de chaîne courte vraiment simple

Existe-t-il une technique de compression vraiment simple pour les chaînes d’une longueur maximale d’environ 255 caractères (oui, je compresse des URL )?

Je ne suis pas concerné par la force de la compression – je recherche quelque chose qui fonctionne très bien et qui est rapide à mettre en œuvre. Je voudrais quelque chose de plus simple que SharpZipLib : quelque chose qui peut être implémenté avec quelques méthodes courtes.

Je pense que la question clé ici est ” Pourquoi voulez-vous compresser les URL?

Essayer de raccourcir les longues URL pour la barre d’adresse?

Vous feriez mieux de stocker l’URL d’origine quelque part (firebase database, fichier texte …) à côté d’un hashcode de la partie non-domaine (MD5, très bien). Vous pouvez alors avoir une simple page (ou un HTTPModule si vous vous sentez flashy) pour lire le MD5 et rechercher la vraie URL. C’est ainsi que TinyURL et d’autres travaillent.

Par exemple:

http://mydomain.com/folder1/folder2/page1.aspx 

Peut être raccourci à:

 http://mydomain.com/2d4f1c8a 

L’utilisation d’une bibliothèque de compression pour cela ne fonctionnera pas . La chaîne sera compressée dans une représentation binary plus courte, mais la reconvertir en une chaîne qui doit être valide en tant que partie d’une URL (par exemple, Base64) annulera tout avantage que vous auriez tiré de la compression.

Stocker de nombreuses URL en mémoire ou sur disque?

Utilisez la bibliothèque de compression intégrée dans System.IO.Compression ou la bibliothèque ZLib qui est simple et incroyablement bonne. Étant donné que vous allez stocker des données binarys, la sortie compressée sera correcte telle quelle. Vous devrez le décompresser pour l’utiliser comme URL.

Comme suggéré dans la réponse acceptée , l’utilisation de la compression des données ne permet pas de raccourcir les chemins d’URL qui sont déjà assez courts.

DotNetZip a une classe DeflateStream qui expose une méthode CompressSsortingng statique (Shared in VB). C’est un moyen d’une ligne de compresser une chaîne à l’aide de DEFLATE ( RFC 1951 ). L’implémentation DEFLATE est entièrement compatible avec System.IO.Compression.DeflateStream , mais DotNetZip se compresse mieux. Voici comment vous pourriez l’utiliser:

 ssortingng[] orig = { "folder1/folder2/page1.aspx", "folderBB/folderAA/page2.aspx", }; public void Run() { foreach (ssortingng s in orig) { System.Console.WriteLine("original : {0}", s); byte[] compressed = DeflateStream.CompressSsortingng(s); System.Console.WriteLine("compressed : {0}", ByteArrayToHexSsortingng(compressed)); ssortingng uncompressed = DeflateStream.UncompressSsortingng(compressed); System.Console.WriteLine("uncompressed: {0}\n", uncompressed); } } 

En utilisant ce code, voici mes résultats de 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 

Ainsi, vous pouvez voir que le tableau d’octets “compressé”, lorsqu’il est représenté en hexadécimal, est plus long que l’original, environ deux fois plus longtemps. La raison en est qu’un octet hexadécimal est en fait 2 caractères ASCII.

Vous pouvez compenser quelque peu cela en utilisant une base 62, au lieu d’une base 16 (hex) pour représenter le nombre. Dans ce cas, az et AZ sont également des chiffres, ce qui vous donne 0-9 (10) + az (+26) + AZ (+26) = 62 chiffres au total. Cela réduirait considérablement la production. Je n’ai pas essayé ça. encore.


MODIFIER
Ok j’ai testé l’encodeur Base-62. Cela raccourcit la chaîne hexagonale d’environ la moitié. Je pensais que cela réduirait à 25% (62/16 = ~ 4) mais je pense que je perds quelque chose avec la discrétisation. Dans mes tests, la chaîne résultante encodée en base 62 a environ la même longueur que l’URL d’origine. Donc, non, utiliser la compression puis l’encodage en base 62 n’est toujours pas une bonne approche. vous voulez vraiment une valeur de hachage.

Je suggère de regarder dans l’ espace de noms System.IO.Compression . Il existe un article sur CodeProject qui peut aider.

Quel est ton but?

  • Une URL plus courte? Essayez des raccourcisseurs d’URL tels que http://tinyurl.com/ ou http://is.gd/
  • Espace de stockage? Découvrez System.IO.Compression. (Ou SharpZipLib )

Je commencerais par essayer l’une des bibliothèques zip existantes (libres ou à code source ouvert), par exemple http://www.icsharpcode.net/OpenSource/SharpZipLib/

Zip devrait bien fonctionner pour les chaînes de texte, et je ne suis pas sûr qu’il soit utile de mettre en œuvre un algorithme de compression yourserlf ….

Avez-vous essayé d’utiliser simplement gzip ?

Aucune idée si cela fonctionnerait efficacement avec des chaînes aussi courtes, mais je dirais que c’est probablement votre meilleur pari.

La bibliothèque open source SharpZipLib est facile à utiliser et vous fournira des outils de compression.

Vous pouvez utiliser directement l’algorithme deflate, sans en-têtes de contrôle ni sum de contrôle, comme décrit dans cette question: Python: implémentations Inflate et Deflate

Cela réduit, selon mon test, une URL de 4 100 caractères à 1 270 caractères base64, ce qui lui permet de s’inscrire dans la limite de 2 000 d’IE.

Et voici un exemple d’ URL de 4 000 caractères , qui ne peut pas être résolue avec une table de hachage car l’applet peut exister sur n’importe quel serveur.

Je viens de créer un schéma de compression qui cible les URL et réalise environ 50% de compression (par rapport à la représentation base64 du texte de l’URL d’origine).

voir http://blog.alivate.com.au/packed-url/