Pregunta

Estoy a punto de usar un algoritmo para codificar una longitud variable pero muy larga Cuerda Campo recuperado de un archivo XML, luego esos datos codificados deben persistirse en la base de datos.

Más tarde, cuando recibo un segundo archivo, necesito obtener los datos codificados de la base de datos (previamente almacenada) y luego decodificarlo y validar con los nuevos datos para duplicar.

Lo intenté org.apache.commons.codec.binary.Base64 clase tiene 2 métodos:

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

Lo que funciona perfectamente bien y resuelve mi problema. Pero convierte 55 cadena de char a solo 6 cadenas de char.

Por lo tanto, me pregunto si hay algún caso en el que estos algoritmo codifiquen 2 cadenas que son muy grandes y solo tienen 1 incumplimiento de carbón (por ejemplo) en las mismas matrices de bytes codificadas.

No sé sobre el Base64 Clase mucho, pero si alguien puede ayudarme, será realmente útil.

Si puede sugerir cualquier otro algoritmo que haga que una cuerda grande fuera de longitud fija y resuelva mi propósito, estaré encantado de usarlo.

Gracias por adelantado.

¿Fue útil?

Solución

No muy eficiente.

Además, usando sun.misc Las clases ofrecen una aplicación no portátil.

Consulte las siguientes comparaciones de rendimiento de Migbase64:

enter image description here


Por lo tanto, me pregunto si hay algún caso en el que estos algoritmo codifiquen 2 cadenas que son muy grandes y solo tienen 1 incumplimiento de carbón (por ejemplo) en las mismas matrices de bytes codificadas.

Base64 no es un algoritmo de hash, es una codificación y, por lo tanto, debe ser bidireccional. Las colisiones no se pueden permitir por necesidad; de lo contrario, la decodificación no sería determinista. Base64 está diseñado para representar datos binarios arbitrarios en una cadena ASCII. Codificar una cadena unicode como base64 a menudo aumentar el número de puntos de código Requerido ya que el conjunto de caracteres Unicode requiere múltiples bytes. La representación Base64 de una cadena Unicode variará según la codificación (UTF-8, UTF-16) utilizada. Por ejemplo:

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

Solución 1

Utilice la compresión sin pérdidas

GZip( UTF8( "test" ) )

Aquí está convirtiendo la cadena en la matriz de bytes y utilizando la compresión sin pérdidas para reducir la cantidad de bytes que tiene que almacenar. Puede variar el algoritmo de codificación y compresión de Char para reducir el número de bytes dependiendo de las cadenas que almacenará (es decir, si es principalmente ASCII, entonces UTF-8 probablemente sea lo mejor.

Pros: sin colisiones, capacidad para recuperar una cadena original
Contras: Los bytes requeridos para almacenar el valor son variables; Los bytes requeridos para almacenar el valor son más grandes

Solución 2

Use un algoritmo de hash

SHA256( UTF8( "test" ) )

Aquí está convirtiendo la cadena en un conjunto de bytes de longitud fija con una función de hash. El hash es unidireccional y por su naturaleza Las colisiones pueden ser posibles. Sin embargo, según el perfil y el número de cadenas que espera procesar, puede seleccionar una función hash para minimizar la probabilidad de colisiones

Pros: Los bytes requeridos para almacenar el valor son fijos; Los bytes requeridos para almacenar el valor son pequeños
Contras: Colisiones posibles, no hay capacidad para recuperar una cadena original

Otros consejos

Acabo de ver tu comentario, parece que en realidad estás buscando compresión en lugar de hashing como pensé inicialmente. Aunque en ese caso, tu no Ser capaz de obtener una salida de longitud fija para la entrada arbitraria (piénselo, un número infinito de entradas no puede asignar bijectivamente a un número finito de salidas), por lo que espero que no sea un requisito fuerte.

En cualquier caso, el rendimiento del algoritmo de compresión elegido dependerá de las características del texto de entrada. En ausencia de más información, la compresión desinflada (según lo utilizado por las transmisiones de entrada ZIP, IIRC) es un buen algoritmo de uso general para comenzar, y al menos usar como base para la comparación. Sin embargo, para facilitar la implementación, puede usar el Deflador Clase integrada en el JDK, que utiliza la compresión de ZLIB.

Si sus cadenas de entrada tienen patrones particulares, entonces diferentes algoritmos de compresión pueden ser más o menos eficientes. En un aspecto, no importa cuál use, si no tiene la intención de que los datos comprimidos sean lees por otros procesos, siempre que pueda comprimir y descomprimirlo, será transparente para sus clientes.

Estas otras preguntas pueden ser de interés:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top