La documentación JDK para java.lang.String.hashCode()
famously dice:Prueba: ¿por qué la implementación de java.lang.String.hashCode() coincide con su documentación?
El código hash para un objeto String se calcula como
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
utilizando
int
aritmética, dondes[i]
es el *i
* º carácter de la cadena,n
es la longitud de la cadena, y^
indica exponenciación.
La implementación estándar de esta expresión es:
int hash = 0;
for (int i = 0; i < length; i++)
{
hash = 31*hash + value[i];
}
return hash;
En cuanto a esto me hace sentir como si estuviera durmiendo a través de mi curso de algoritmos. ¿Cómo se traduce esa expresión matemática en el código de arriba?
RE su primera oración: ¿Vio alguna evidencia de que la pregunta o una respuesta en particular estaba asumiendo xor? –
Ha expresado confusión acerca de cómo el código y la documentación podrían ser equivalentes. Dado que la documentación usaba "^" para la exponenciación, pero Java normalmente la usa para significar bit a bit xo, me pregunté si esa era la fuente de su confusión. (No hubo otras respuestas cuando comencé a escribir mi respuesta, por cierto) –
Ahh, ya veo. No, era consciente de que era una exponenciación, pero no estaba claro cómo se siguió la implementación desde la expresión matemática. Tu respuesta aclara eso en gran medida, pero saber escribir ese código que solo da esa expresión sigue siendo un gran salto para mí. Para llegar a ese código, parece que tendrías que escribir un pequeño ejemplo, darte cuenta de que puedes "multiplicar por 0 de una manera inteligente" en el anidamiento más interno para completar el patrón, luego formar el ciclo. –