En Java, se puede usar un algoritmo de hashcode para calcular el valor hash de una cadena. Hoy, un amigo de repente me preguntó si puedo calcular el codo hash en JS, y el requisito es el mismo que el resultado del cálculo de hashcode de Java.
Nunca he entendido el algoritmo del hashcode de Java hasta ahora, pero probablemente no será demasiado difícil. Así que escribí este código en Java para las pruebas:
Resultado de ejecución: 899755
Presione la tecla CTRL y haga clic en el nombre del método hashcode para hacer un seguimiento y mire su algoritmo. Descubrí que son algunas oraciones de código simples, como se muestra a continuación:
La copia del código es la siguiente:
public int hashcode () {
int h = hash;
if (h == 0) {
int off = offset;
char val [] = valor;
int len = count;
para (int i = 0; i <len; i ++) {
H = 31*H+Val [OFF ++];
}
hash = h;
}
regresar h;
}
Ahora, debería estar bien si simplemente lo transmite a JS. Entonces escribí el siguiente código JS:
La copia del código es la siguiente:
<script type = "text/javaScript">
función hashcode (str) {
var h = 0, apagado = 0;
var len = str.length;
para (var i = 0; i <len; i ++) {
H = 31 * H+Str.CharCodeat (OFF ++);
}
regresar h;
}
alerta (hashcode ('shenyang'));
</script>
Resultado de ejecución: 899755
Ok, lo mismo que el resultado del cálculo de Java. Pensé que esto se haría, y luego pensé en encontrar una cadena para probarlo:
"Shenyang, Shenyang", el resultado de correr en Java es: 1062711668, pero se convierte en: 26832515444 en JS.
¡Soy tan terrible que hay un problema con este solo un intento! Después de pensar por un momento, de repente me di cuenta de que la duración de INT en Java parece ser de unos 2.100 millones, y no existe tal restricción en JS. El problema debería estar aquí, así que hice algunas modificaciones al método anterior:
La copia del código es la siguiente:
<script>
función hashcode (str) {
var h = 0, apagado = 0;
var len = str.length;
para (var i = 0; i <len; i ++) {
H = 31 * H+Str.CharCodeat (OFF ++);
}
var t = -2147483648*2;
while (h> 2147483647) {
H+= T
}
regresar h;
}
alerta (hashcode ('shenyang shenyang')); </script>
¡Prueba de nuevo! ¡DE ACUERDO! La misión está hecha. Sin contenido técnico, un pequeño resumen
Actualizado el 2013-02-19, el anterior es relativamente ineficiente y se disipará cuando el contenido sea muy largo. El siguiente código es el código optimizado:
La copia del código es la siguiente:
<script>
función hashcode (str) {
var h = 0;
var len = str.length;
var t = 2147483648;
para (var i = 0; i <len; i ++) {
h = 31 * H + str.charcodeat (i);
if (h> 2147483647) H %= t; // java int se desborda para tomar el módulo
}
/ * var t = -2147483648 * 2;
while (h> 2147483647) {
H += T
}*/
regresar h;
}
alerta (hashcode ('c# cómo ejecutar n hilos en al mismo tiempo al mismo tiempo, el resto se implementan en la cola')); // 1107373715
</script>