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:

  1. encodeBase64(Byte[] barray)
  2. 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.

Était-ce utile?

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 :

entrer image description ici


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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top