6 votes

Compression d'un grand nombre (ou d'une chaîne) en une petite valeur

Ma page ASP.NET a le paramètre de chaîne de requête suivant :

…?IDs=1000000012,1000000021,1000000013,1000000022&...

Aquí IDs aura toujours des nombres séparés par quelque chose, dans ce cas-ci , . Actuellement, il y a 4 numéros mais normalement ils devraient se situer entre les deux. 3 y 7 .

Maintenant, je cherche une méthode pour convertir chaque grand nombre ci-dessus en une valeur aussi petite que possible, en particulier en comprimant la valeur de IDs paramètre de la chaîne d'interrogation. Tant la compression de chaque algorithme numérique que la compression de la valeur totale de l'algorithme de la IDs sont les bienvenues.

  1. Le codage ou le décodage n'est pas un problème ; il s'agit simplement de compresser la valeur. IDs paramètre de la chaîne de requête.
  2. Créer une petite valeur unique pour IDs et ensuite récupérer sa valeur à partir d'une source de données est hors de portée.

Existe-t-il un algorithme permettant de comprimer de tels grands nombres en petites valeurs ou de comprimer la valeur de l'indice de l'eau ? IDs le paramètre de chaîne de requête tous ensemble ?

0voto

Stephen C Points 255558

Je suppose que vous faites cela pour contourner les restrictions de longueur des URL de demande ...

D'autres réponses ont suggéré d'encoder les numéros d'identification décimaux en hexadécimal, base47 ou base64, mais vous pouvez (en théorie) faire beaucoup mieux que cela en utilisant LZW (ou similaire) pour compresser la liste d'identification. Selon le degré de redondance de vos listes d'identifiants, vous pourriez obtenir une réduction nettement supérieure à 40 %, même après avoir ré-encodé les octets compressés en tant que texte.

En résumé, je vous suggère de trouver une bibliothèque de compression de texte standard implémentée en Javascript et de l'utiliser côté client pour compresser la liste des identifiants. Encodez ensuite l'octet compressé en utilisant base47/base64, et passez la chaîne encodée comme paramètre de l'URL. Du côté du serveur, faites l'inverse, c'est-à-dire décodez puis décompressez.

EDIT : A titre expérimental, j'ai créé une liste de 36 identifiants différents comme ceux que vous avez fournis et je l'ai compressée en utilisant gzip. Le fichier original fait 396 octets, le fichier compressé 101 octets, et le fichier compressé + base64 138 octets. Cela représente une réduction globale de 65 %. Et le taux de compression pourrait effectivement s'améliorer pour les fichiers plus volumineux. Cependant, lorsque j'ai essayé avec un petit ensemble d'entrée (par exemple juste les 4 identifiants originaux), je n'ai obtenu aucune compression, et après l'encodage la taille était plus grande que l'original.

Google "lzw library javascript"

En théorie, il pourrait y avoir une solution plus simple. Envoyez les paramètres en tant que "post data" plutôt que dans l'URL de la requête, et demandez au navigateur d'appliquer la compression en utilisant l'un des codages qu'il comprend. Cela vous permettra également de réaliser des économies puisqu'il n'est pas nécessaire d'encoder les données compressées dans les caractères légaux de l'URL.

Le problème est de faire en sorte que le navigateur compresse la demande ... et de le faire d'une manière indépendante du navigateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X