Domanda

Sto per usare un algoritmo per codificare una lunghezza variabile ma molto lungo Corda campo recuperato da un file XML, quindi che i dati codificati dovrebbero essere persistiti nel database.

Successivamente, quando ricevo un secondo file, devo recuperare i dati codificati dal database (precedentemente memorizzati) e quindi decodirli e convalidare con i nuovi dati per duplicato.

Provai org.apache.commons.codec.binary.Base64 Classe ha 2 metodi:

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

Il che funziona perfettamente e risolve il mio problema. Ma converte 55 String Char in solo 6 String Char.

Quindi mi chiedo se ci sia un caso in cui questi algoritmo codificano 2 stringhe che sono molto grandi e hanno solo 1 mancata corrispondenza (ad esempio) nelle stesse array di byte codificati.

Non so sapere del Base64 Classe molto ma se qualcuno può aiutarmi, sarà davvero utile.

Se puoi suggerire qualsiasi altro algoritmo che rende una grande corda a corto di lunghezza fissa e risolva il mio scopo, sarò felice di usarlo.

Grazie in anticipo.

È stato utile?

Soluzione

Non molto efficiente.

Inoltre, usando sun.misc Le lezioni forniscono un'applicazione non portabile.

Dai un'occhiata ai seguenti confronti delle prestazioni da Migbase64:

enter image description here


Quindi mi chiedo se ci sia un caso in cui questi algoritmo codificano 2 stringhe che sono molto grandi e hanno solo 1 mancata corrispondenza (ad esempio) nelle stesse array di byte codificati.

Base64 non è un algoritmo di hashing, è una codifica e deve quindi essere bidirezionale. Le collisioni non possono essere consentite dalla necessità: altrimenti la decodifica non sarebbe deterministica. Base64 è progettato per rappresentare dati binari arbitrari in una stringa ASCII. Codificare una stringa unicode come base64 sarà spesso aumento il numero di punti di codice richiesto poiché il set di caratteri Unicode richiede più byte. La rappresentazione di base64 di una stringa Unicode varierà in base alla codifica (UTF-8, UTF-16) utilizzata. Per esempio:

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

Soluzione 1

Usa la compressione senza perdita

GZip( UTF8( "test" ) )

Qui stai convertendo la stringa in array di byte e usando la compressione senza perdita per ridurre il numero di byte che devi archiviare. È possibile variare l'algoritmo di codifica e compressione del carbone per ridurre il numero di byte a seconda delle stringhe che si memorizzano (cioè se è per lo più ASCII, probabilmente UTF-8 sarà probabilmente il migliore.

Professionisti: nessuna collisione, capacità di recuperare la stringa originale
Contro: Byte richieste per archiviare il valore è variabile; I byte necessari per archiviare il valore sono più grandi

Soluzione 2

Usa un algoritmo di hashing

SHA256( UTF8( "test" ) )

Qui stai convertendo la stringa in un set di lunghezza fissa di byte con una funzione di hashing. L'hashing è universo e per sua natura Le collisioni possono essere possibili. Tuttavia, in base al profilo e al numero di stringhe che prevedi di elaborare puoi selezionare una funzione hash per ridurre al minimo la probabilità di collisioni

Professionisti: Byte richieste per archiviare il valore è fisso; byte richieste per archiviare il valore è piccolo
Contro: Collisioni possibili, nessuna capacità di recuperare la stringa originale

Altri suggerimenti

Ho appena visto il tuo commento - sembra che tu stia davvero cercando la compressione piuttosto che hash come ho pensato inizialmente. Anche se in quel caso, tu non Essere in grado di ottenere un'output a lunghezza fissa per input arbitrari (pensaci, un numero infinito di input non può mappare in modo bilico in un numero finito di output), quindi spero che non fosse un requisito forte.

In ogni caso, le prestazioni dell'algoritmo di compressione prescelto dipenderanno dalle caratteristiche del testo di input. In assenza di ulteriori informazioni, la compressione sgonfia (come utilizzato dai flussi di input zip, IIRC) è un buon algoritmo per scopi generali per iniziare e almeno utilizzare come base per il confronto. Per facilità di implementazione, tuttavia, puoi usare il Deflatore Classe incorporata nel JDK, che utilizza la compressione Zlib.

Se le stringhe di input hanno modelli particolari, diversi algoritmi di compressione possono essere più o meno efficienti. Da un aspetto non importa quale utilizzi, se non intendi i dati compressi per essere letti da altri processi - purché tu possa comprimere e decomprimere te stesso, sarà trasparente per i tuoi clienti.

Queste altre domande possono essere di interesse:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top