Quelle est l'efficacité de l'algorithme de codage / décodage de classe BASE64 en Java?
-
28-10-2019 - |
Question
Je suis sur le point d'utiliser un algorithme pour coder une longueur variable mais très longue Chaîne champ récupéré à partir d'un fichier XML, alors que les données codées doivent être conservées dans la base de données.
Plus tard, quand je reçois un second fichier que je dois récupérer les données codées de base de données (stockées précédemment), puis le décoder et valider avec les nouvelles données pour double.
J'ai essayé classe org.apache.commons.codec.binary.Base64
il dispose de 2 méthodes:
-
encodeBase64(Byte[] barray)
-
decodeBase64(String str)
qui fonctionne parfaitement bien et résout mon problème. Mais il convertit la chaîne 55 char à seulement 6 cordes char.
Alors, je me demande s'il y a un cas où ces algorithmes encode 2 cordes qui sont très grandes et ont seulement 1 décalage de char (par exemple) en même tableaux d'octets encodée.
Je sais DONOT sur la classe Base64
beaucoup, mais si quelqu'un peut me aider ce sera vraiment utile.
Si vous pouvez proposer tout autre algorithme qui fait une grande chaîne courte de longueur fixe et résout mon but, je serai heureux de l'utiliser.
Merci à l'avance.
La solution
Pas très efficace.
En outre, l'utilisation des classes sun.misc
donne une application non-portable.
Consultez les comparaisons de performance suivantes de MiGBase64 :
Alors, je me demande s'il y a un cas où ces algorithmes code pour 2 chaînes qui sont très grandes et ont seulement 1 incompatibilité de char (par exemple) en même tableaux d'octets codée.
base64 n'est pas un algorithme de hachage, il est un codage et doit donc être bidirectionnel. Collisions ne peuvent pas être autorisés par la nécessité - le décodage autrement serait non déterministe. Base64 est conçu pour représenter des données binaires arbitraires dans une chaîne ASCII. Codant pour une chaîne Unicode en base64 sera souvent augmentation le nombre de points de code nécessaire car le jeu de caractères Unicode nécessite plusieurs octets. La représentation en base 64 d'une chaîne de caractères Unicode varie en fonction de l'encodage (UTF-8, UTF-16) utilisé. Par exemple:
Base64( UTF8( "test" ) ) => "dGVzdA=="
Base64( UTF16( "test" ) ) => "/v8AdABlAHMAdA=="
Solution 1
Utiliser la compression sans perte
GZip( UTF8( "test" ) )
Ici, vous transformez la chaîne à tableau d'octets et en utilisant la compression sans perte pour réduire le nombre d'octets que vous avez à stocker. Vous pouvez modifier le codage char et de l'algorithme de compression pour réduire le nombre d'octets en fonction des chaînes que vous entreposez (s'il est la plupart du temps ASCII alors UTF-8 sera probablement mieux.
Plus : pas de collision, la capacité à récupérer chaîne originale
Inconvénients : octets nécessaires pour stocker la valeur est variable; octets nécessaires pour stocker la valeur est plus grande
Solution 2
Utilisez un algorithme de hachage
SHA256( UTF8( "test" ) )
Ici, vous transformez la chaîne à un ensemble de longueur fixe d'octets avec une fonction de hachage. Hash est uni-directionnel et par sa nature . Cependant, en fonction du profil et le nombre de chaînes que vous vous attendez à traiter, vous pouvez sélectionner une fonction de hachage pour minimiser la probabilité de collisions
Plus : octets requis pour stocker la valeur est fixée; octets nécessaires pour stocker la valeur est petite
Inconvénients : Collisions possible, aucune possibilité de récupérer chaîne d'origine
Autres conseils
Je viens de voir votre commentaire - il semble que vous cherchez réellement à la compression plutôt que Hashage je pensais au départ. Bien que dans ce cas, vous pas être en mesure d'obtenir la sortie de longueur fixe pour l'entrée arbitraire (pensez à ce sujet, un nombre infini d'entrées ne peut pas la carte bijection à un nombre fini de sorties), donc je l'espère ce n'était pas une exigence forte.
Dans tous les cas, les performances de votre algorithme de compression choisi dépendra des caractéristiques du texte d'entrée. En l'absence de plus amples informations, compression deflate (tel qu'il est utilisé par les flux d'entrée de code postal, IIRC) est un bon algorithme d'usage général pour commencer, et au moins une utilisation comme base de comparaison. Pour faciliter la mise en œuvre, cependant, vous pouvez utiliser le la classe de Deflator intégré dans le JDK, qui utilise la compression ZLib.
Si vos chaînes d'entrée ont des motifs particuliers, puis différents algorithmes de compression peut être plus ou moins efficace. Dans un égard, il n'a pas d'importance que celui que vous utilisez, si vous ne comptez pas les données compressées à lire par tout autre processus -. Tant que vous pouvez compresser et décompresser vous, ce sera transparent pour vos clients
Ces questions peuvent intéresser: