55 votes

Comment compresser une chaîne?

J'utilise GZIPOutputStream ou ZIPOutputStream pour compresser une Chaîne de caractères( ma chaîne.longueur() est à moins de 20), mais le compresser le résultat est plus longue que la chaîne d'origine.

sur certains site, j'ai trouvé des amis a dit que c'est parce que ma chaîne d'origine est trop court, GZIPOutputStream est seulement l'utiliser pour compresser longue chaîne.

donc, quelqu'un peut-il me donner une aide pour compresser une Chaîne de caractères? la fonction est comme:

String compress(String original) throws Exception {


 }

Mise à jour:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import java.util.zip.*;

public class zipUtil{
public static String compress(String str){
    if (str == null || str.length() == 0) {
        return str;
    }
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    GZIPOutputStream gzip = new GZIPOutputStream(out);
    gzip.write(str.getBytes());
    gzip.close();
    return out.toString("ISO-8859-1");
 }

 public static void main(String[] args) throws IOException {
String string = "admin";
    System.out.println("after compress:");
    System.out.println(ZipUtil.compress(string));

  }
}

le résultat est :

alt text

41voto

JesperE Points 34356

Les algorithmes de compression ont presque toujours une certaine forme d'espace disque, ce qui signifie qu'ils ne sont efficaces que pour la compression de données suffisamment volumineuses pour que le temps système soit inférieur à la quantité d'espace économisé.

Compresser une chaîne de 20 caractères seulement n’est pas facile et n’est pas toujours possible. Si vous avez de la répétition, le codage de Huffman ou un codage simple en longueur peut être compressé, mais probablement pas beaucoup.

10voto

Jon Freedman Points 4411

Lorsque vous créez une Chaîne de caractères, vous pouvez la considérer comme une liste de char, ce qui signifie que pour chaque caractère dans votre Chaîne, vous devez prendre en charge toutes les valeurs possibles de char. Du soleil docs

char: Le type de données char est un seul de caractères Unicode 16 bits. Il a une valeur minimale de '\u0000' (ou 0) et une valeur maximale de '\uffff " (ou de 65 535 inclus).

Si vous avez un ensemble réduit de caractères que vous voulez, vous pouvez écrire un simple algorithme de compression, qui est analogue binaire->décimal->hex radix converstion. Vous allez à partir de 65 536 (ou le nombre de caractères de votre système cible prend en charge) à 26 (par ordre alphabétique) / 36 (alphanumérique) etc.

J'ai utilisé cette astuce un peu de temps, par exemple l'encodage des horodateurs, en tant que texte (cible 36 +, source 10) - assurez-vous d'avoir beaucoup de tests unitaires!

8voto

Arne Points 6797

Si les mots de passe sont plus ou moins "au hasard", vous êtes hors de la chance, vous ne serez pas en mesure d'obtenir une réduction significative de la taille.

Mais: Pourquoi avez-vous besoin de compresser les mots de passe? Peut-être ce dont vous avez besoin n'est pas une compression, mais une sorte de valeur de hachage? Si vous avez juste besoin de vérifier si un nom correspond à un mot de passe, vous n'avez pas besoin de faire enregistrer le mot de passe, mais peut sauver le hash d'un mot de passe. Pour vérifier si un tapé le mot de passe correspond à un nom donné, vous pouvez construire la valeur de hachage de la même façon et de le comparer à l'sauvé de hachage. Comme une table de hachage (Objet.hashCode()) est un int, vous serez en mesure de stocker toutes les 20 mot de passe-hachages dans 80 octets).

6voto

Matthew Flaschen Points 131723

Votre ami est correct Les deux gzip et ZIP sont basés sur DEFLATE . Ceci est un algorithme à usage général et n'est pas destiné à l'encodage de petites chaînes.

Si vous en avez besoin, une solution possible est un encodage et un décodage personnalisés HashMap<String, String> . Cela peut vous permettre de faire un simple mappage un à un:

 HashMap<String, String> toCompressed, toUncompressed;

String compressed = toCompressed.get(uncompressed);
// ...
String uncompressed = toUncompressed.get(compressed);
 

Clairement, cela nécessite une configuration et n’est pratique que pour un petit nombre de chaînes.

4voto

Noel M Points 6263

Le codage Huffman peut aider, mais seulement si vous avez beaucoup de caractères fréquents dans votre petite chaîne.

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