Frage

Ich bin kurz davor, einen Algorithmus zu verwenden, um eine variable Länge zu codieren, aber sehr lang Saite Das von einer XML -Datei abgerufene Feld, dann sollten codierte Daten in der Datenbank bestehen bleiben.

Später, wenn ich eine zweite Datei erhalte, muss ich die codierten Daten aus der Datenbank (zuvor gespeichert) abrufen, sie dann entschlüsseln und mit den neuen Daten für Duplikat validieren.

Ich habe es versucht org.apache.commons.codec.binary.Base64 Klasse Es hat 2 Methoden:

  1. encodeBase64(Byte[] barray)
  2. decodeBase64(String str)

Das funktioniert vollkommen in Ordnung und löst mein Problem. Aber es konvertiert 55 Zeichenstring in nur 6 Zeichenstring.

Ich frage mich also, ob es einen Fall gibt, in dem dieser Algorithmus 2 Zeichenfolgen codiert, die sehr groß sind und nur 1 Zeichen (zum Beispiel) in die gleichen codierten Byte -Arrays haben.

Ich weiß nicht über das Base64 Klasse viel, aber wenn mir jemand helfen kann, wird es wirklich hilfreich sein.

Wenn Sie einen anderen Algorithmus vorschlagen können, der eine große feste Länge kurz macht und meinen Zweck löst, werde ich ihn gerne verwenden.

Danke im Voraus.

War es hilfreich?

Lösung

Nicht sehr effizient.

Auch verwenden sun.misc Klassen geben eine nicht portable Anwendung.

Schauen Sie sich die folgenden Leistungsvergleiche an Migbase64:

enter image description here


Ich frage mich also, ob es einen Fall gibt, in dem dieser Algorithmus 2 Zeichenfolgen codiert, die sehr groß sind und nur 1 Zeichen (zum Beispiel) in die gleichen codierten Byte -Arrays haben.

Base64 ist kein Hashing-Algorithmus, es ist eine Codierung und muss daher bidirektional sein. Kollisionen können nicht nötig zulässig sein - sonst wäre die Dekodierung nicht deterministisch. Base64 ist so konzipiert, dass beliebige Binärdaten in einer ASCII -Zeichenfolge dargestellt werden. Codierung einer Unicode -Zeichenfolge als Base64 oft Zunahme die Anzahl der Codepunkte Erforderlich, da der Unicode -Zeichensatz mehrere Bytes benötigt. Die Base64-Darstellung einer Unicode-Zeichenfolge variiert je nach Codierung (UTF-8, UTF-16). Zum Beispiel:

Base64( UTF8( "test" ) ) => "dGVzdA=="
Base64( UTF16( "test" ) ) => "/v8AdABlAHMAdA=="

Lösung 1

Verwenden Sie verlustfreie Kompression

GZip( UTF8( "test" ) )

Hier konvertieren Sie die Zeichenfolge in Byte -Array und verwenden eine verlustfreie Komprimierung, um die Anzahl der Bytes zu verringern, die Sie speichern müssen. Sie können den char Coding- und Komprimierungsalgorithmus variieren, um die Anzahl der Bytes abhängig von den Saiten zu reduzieren, die Sie speichern werden (dh wenn es sich hauptsächlich um ASCII handelt, ist UTF-8 wahrscheinlich am besten.

Profis: Keine Kollisionen, Fähigkeit, den ursprünglichen String wiederherzustellen
Nachteile: Bytes, die zum Speichern von Wert erforderlich sind, ist variabel; Bytes, die zum Speichern von Wert erforderlich sind, sind größer

Lösung 2

Verwenden Sie einen Hashing -Algorithmus

SHA256( UTF8( "test" ) )

Hier konvertieren Sie die Zeichenfolge in eine feste Länge von Bytes mit einer Hashing -Funktion. Hashing ist unisch-lichtend und von Natur aus Kollisionen können möglich sein. Basierend auf dem Profil und der Anzahl der Zeichenfolgen, die Sie erwarten, können Sie eine Hash -Funktion auswählen, um die Wahrscheinlichkeit von Kollisionen zu minimieren

Profis: Bytes, die zum Speichern von Wert erforderlich sind, wird festgelegt. Bytes, die zum Speichern von Wert erforderlich sind, sind klein
Nachteile: Kollisionen möglich, keine Fähigkeit, die ursprüngliche Zeichenfolge wiederherzustellen

Andere Tipps

Ich habe gerade Ihren Kommentar gesehen - es scheint, dass Sie tatsächlich nach Komprimierung suchen als nach Hashing, wie ich anfangs dachte. In diesem Fall sind Sie zwar Sie Gewohnheit In der Lage sein, die Ausgabe der festen Länge für willkürliche Eingaben zu erhalten (denken Sie darüber nach, eine unendliche Anzahl von Eingängen kann nicht bijektiv auf eine endliche Anzahl von Ausgängen zugeordnet werden), daher hoffe ich, dass dies keine starke Anforderung war.

In jedem Fall hängt die Leistung Ihres ausgewählten Komprimierungsalgorithmus von den Eigenschaften des Eingabetxtes ab. In Ermangelung weiterer Informationen ist die Entlegerkomprimierung (wie von den Zip-Eingangsströmen, IIRC) ein guter allgemeiner Algorithmus, mit dem zunächst und zumindest als Vergleichsbasis verwendet wird. Zur einfachen Implementierung können Sie jedoch die verwenden Deflator Klasse in das JDK eingebaut, das ZLIB -Komprimierung verwendet.

Wenn Ihre Eingangszeichenfolgen bestimmte Muster aufweisen, können verschiedene Komprimierungsalgorithmen mehr oder weniger effizient sein. In einer Hinsicht spielt es keine Rolle, welche Sie verwenden. Wenn Sie nicht beabsichtigen, die komprimierten Daten von anderen Prozessen zu lesen - solange Sie sich komprimieren und dekomprimieren können, ist dies für Ihre Kunden transparent.

Diese anderen Fragen können von Interesse sein:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top