calcular el hash md5 de datos de varias partes (cadenas múltiples)

Estoy tratando de crear un hash md5 [único] de múltiples cadenas [en Java]. Eso es lo que quiero

md5(string1, string2, string3, ..., stringN)

Actualmente estoy tratando de concatenar todas las cadenas con un separador poco usado como #. Es decir

md5(string1#string2#...#stringN)

Esto parece extraño y me preocupa que alguna cuerda extraña tenga el separador como parte de ella. ¿Cuál es la mejor manera de hacerlo?

Respuesta 1

Realmente no importa si el separador es parte de la cadena. Probablemente ni siquiera necesite un separador, ya que no va a descomponer la cadena concatenada en partes

Respuesta: 2

Me he encontrado con un problema similar antes, y la mejor solución que se me ocurrió fue usar un carácter ASCII no tipificable como separador. Mira "man ascii" y elige uno. Mi favorito es '\ a', que es el símbolo ASCII para el sonido de "campana".

Respuesta: 3

Si desea asegurarse de que no puede haber colisión simplemente moviendo el texto de una cadena a la siguiente, le recomiendo este esquema:

md5(<len1>+str1+<len2>+str2...)

Aquí, len1 es una representación de longitud fija de la longitud de str1. Para md5, sería más apropiado usar un valor int de cuatro bytes (suponiendo que sepa que no tendrá cadenas de más de 2 ** 31). Alternativamente, use "longitud decimal #", es decir (en notación Python)

md5(str(len(str1))+"#"+str(len(str2))+"#"+str2+...)

Esto no puede producir colisiones simplemente moviendo el texto de una cadena a la otra, ya que las longitudes cambiarían.

Respuesta: 4

Simplemente no los separes. Es un método hash: no sirve de nada separarlos ...

MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] bytes = ...;
for (String toHash: stringsToHash) {
  md5.update(toHash.getBytes("UTF-8"));
}
md5.digest(bytes);
Respuesta: 5

para cadenas, creo que la solución + Coly Klein de agregar caracteres que no se pueden escribir es la mejor.

Si desea una solución que también funcione para datos binarios, o no está seguro de que la cadena no contenga esos caracteres, puede usar hash recursivo, por ejemplo:

md5(md5(str1)+md5(str2)+md5(str3)+...+)

depende de la cantidad de datos que esta solución puede exigir muchos recursos (no hace mucho perfilé un programa y descubrí que el 97% de su tiempo calcula sha1, así que debo advertirle ...)

Respuesta: 6

puede usar base64 para codificar su Cadena antes de agregar su cadena. luego, en la función md5, divide tu cadena y decodifícala. por ejemplo

public class MutilMd5 {

public static void main(String[] args) throws Base64DecodingException {
    String s1 = "12#3";
    String s2 = "#12345";

    multMd5(Base64.encode(s1.getBytes()) + "#" + Base64.encode(s2.getBytes()));

}

public static void multMd5(String value) throws Base64DecodingException {
    String md5 = "";
    String[] encodeStrings = value.split("#");
    if (encodeStrings != null) {
        for (String encodeString : encodeStrings) {
            System.out.println(new String(Base64.decode(encodeString.getBytes())));
            md5 = md5 + DigestUtils.md5Hex(encodeString);
        }
    }

    System.out.println(md5);
}

}

la salida es

12 # 3

12345

13094636ff02b51be53c496d04d39bc2375704c2e00da07d2c9acc7646b2a844

Respuesta: 7

Puede usar la clase MessageDigest para generar su código. Si yo fuera usted, si en una etapa previa al proceso conozco la longitud de cada Cadena, las pasaría como una Cadena única. Si las cadenas que está pasando tienen diferentes longitudes aleatorias que no se pueden conocer, las analizaría una por una, pero necesito saber si la entidad de origen y la entidad de recepción están bien sincronizadas para saber la longitud de los mensajes que están pasando entre ellos

private static final char[] HEXADECIMAL = { '0', '1', '2', '3',
    '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

public  String hash(String stringToHash)  {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] bytes = md.digest(stringToHash.getBytes());
        StringBuilder sb = new StringBuilder(2 * bytes.length);
        for (int i = 0; i < bytes.length; i++) {
            int low = (int)(bytes[i] & 0x0f);
            int high = (int)((bytes[i] & 0xf0) >> 4);
            sb.append(HEXADECIMAL[high]);
            sb.append(HEXADECIMAL[low]);
        }
        return sb.toString();
    } catch (NoSuchAlgorithmException e) {
        //exception handling goes here
        return null;
    }
}
Respuesta: 8

¿Cuál de las siguientes bases de datos es mejor para una gran aplicación de escritorio: Firebird, JavaDB, hsqldb? Necesito rendimiento, facilidad de uso y licencia totalmente gratuita.

Digamos que tengo una clase 'Perro' con muchos valores de Cadena y quiero todos esos valores en una Lista, ¿habría alguna forma mejor que agregar cada valor por sí mismos? Por ejemplo, toma esta clase ficticia, nota ...

Tengo una situación similar a una pregunta anterior sobre la emisión de XML. Estoy analizando datos en un SAX ContentHandler mientras los serializo en una secuencia. Sospecho que la solución en el enlace ...

Usando Java y Bouncy Castle 1.52, puedo cargar la clave privada a través del certificado PEM usando el siguiente código. También tengo un archivo private.key del mismo en formato PKCS8. ¿Cuál es el código a usar ...