La lectura de los algoritmos cuarta edición de Robert Sedgewick y Kevin Wayne me encontré con la siguiente pregunta:
ataque Hash: hay 2 ^ n cuerdas, cada una de longitud 2 ^ N, que tiene el valor mismo hashCode (), suponiendo que la aplicación hashCode () para la cadena es el siguiente:
public int hashCode() {
int hash = 0;
for (int i = 0; i < length(); i++)
hash = (hash * 31) + charAt(i);
return hash;
}
fuerte indicio: AA y BB tienen el mismo valor.
Lo que viene en mi mente está generando todas las posibles cadenas de longitud 2 ^ N y comparar sus hashcodes. Esto, sin embargo, es muy caro para N grande y dudo que es la solución correcta. ¿Me puede dar consejos lo que echo en toda la imagen?
Andreas' y Glains' respuestas son ambas correctas, pero no son exactamente lo que necesita si su objetivo es producir 2 N series diferentes de longitud 2 N .
Por el contrario, un enfoque más simple es la construcción de cadenas que consta únicamente de secuencias concatenadas de Aa
y BB
. Para longitud 2 × 1 que tienen { Aa
, BB
}; de longitud 2 × 2 que tienen { AaAa
, AaBB
, BBAa
, BBBB
}, de longitud 2 × 3 que tienen { AaAaAa
, AAaaBB
, AaBBAa
, AaBBBB
, BBAaAa
, BBAaBB
, BBBBAa
, BBBBBB
}; y así.
(Nota: usted ha citado el texto diciendo que las cadenas deben tener una longitud 2 N supongo que usted citado en forma inexacta, y de hecho es pedir longitud 2. N ; pero si es de hecho pidiendo longitud 2 N , entonces se puede caer simplemente los elementos a medida que avanza.)