Em Java, um algoritmo de hashcode pode ser usado para calcular o valor de hash de uma string. Hoje, um amigo de repente me perguntou se eu posso calcular o código de hash no JS, e o requisito é o mesmo que o resultado do cálculo do código de hashcode de Java.
Eu nunca entendi o algoritmo do código de hash de Java até agora, mas provavelmente não será muito difícil. Então, escrevi este código em Java para testes:
Resultado em execução: 899755
Pressione a tecla Ctrl e clique no nome do método HashCode para acompanhar e observar seu algoritmo. Descobri que são algumas frases simples de código, como mostrado abaixo:
A cópia do código é a seguinte:
public int hashcode () {
int h = hash;
if (h == 0) {
int off = deslocamento;
char val [] = valor;
int len = count;
para (int i = 0; i <len; i ++) {
h = 31*h+val [off ++];
}
hash = h;
}
retornar h;
}
Agora, deve estar tudo bem se você simplesmente portar para JS. Então eu escrevi o seguinte código JS:
A cópia do código é a seguinte:
<script type = "text/javascript">
função hashcode (str) {
var H = 0, off = 0;
var len = str.Length;
for (var i = 0; i <len; i ++) {
h = 31 * h+str.charcodeat (off ++);
}
retornar h;
}
alerta (hashcode ('shenyang'));
</script>
Resultado em execução: 899755
OK, o mesmo que o resultado do cálculo Java. Eu pensei que isso seria feito, e então pensei em encontrar uma string para testá -la:
"Shenyang, Shenyang", o resultado da corrida em Java é: 1062711668, mas se torna: 26832515444 em JS.
Eu sou tão terrível, há um problema com isso apenas uma tentativa! Depois de pensar por um momento, de repente percebi que o comprimento do int em Java parece ser de cerca de 2,1 bilhões, e não há essa restrição em JS. O problema deve estar aqui, então fiz algumas modificações no método anterior:
A cópia do código é a seguinte:
<Cript>
função hashcode (str) {
var H = 0, off = 0;
var len = str.Length;
for (var i = 0; i <len; i ++) {
h = 31 * h+str.charcodeat (off ++);
}
var t = -2147483648*2;
while (h> 2147483647) {
h+= t
}
retornar h;
}
alerta (hashcode ('shenyang shenyang')); </script>
Teste de novo! OK! A missão é feita. Sem conteúdo técnico, um pouco de resumo
Atualizado em 2013-02-19, o acima é relativamente ineficiente e será dissipado quando o conteúdo for muito longo. O código a seguir é o código otimizado:
A cópia do código é a seguinte:
<Cript>
função hashcode (str) {
var h = 0;
var len = str.Length;
var t = 2147483648;
for (var i = 0; i <len; i ++) {
h = 31 * h + str.charcodeat (i);
if (h> 2147483647) h %= t; // java int transbordar para levar o módulo
}
/ * var t = -2147483648 * 2;
while (h> 2147483647) {
h += t
}*/
retornar h;
}
alerta (hashcode ('c# como executar n threads em simultaneamente ao mesmo tempo, o restante é implementado na fila')); // 1107373715
</script>