В Java алгоритм хэшкодов может использоваться для расчета хеш -значения строки. Сегодня друг внезапно спросил меня, могу ли я рассчитать хэшкод в JS, и требование такое же, как и результат расчета хэшкода в Java.
Я никогда не понимал алгоритм хашкода Java до сих пор, но, вероятно, это не будет слишком сложно. Итак, я написал этот код в Java для тестирования:
Результат работы: 899755
Нажмите клавишу CTRL и нажмите имя метода HashCode, чтобы следить за его алгоритмом. Я обнаружил, что это несколько простых кодовых предложений, как показано ниже:
Кода -копия выглядит следующим образом:
public int hashcode () {
int h = хэш;
if (h == 0) {
int off = offset;
char val [] = value;
int len = count;
для (int i = 0; i <len; i ++) {
h = 31*h+val [off ++];
}
хэш = h;
}
возврат H;
}
Теперь все должно быть в порядке, если вы просто перенесете его в JS. Итак, я написал следующий код JS:
Кода -копия выглядит следующим образом:
<script type = "text/javascript">
функция HashCode (str) {
var h = 0, off = 0;
var len = str.length;
для (var i = 0; i <len; i ++) {
h = 31 * h+str.charcodeat (off ++);
}
возврат H;
}
предупреждение (Hashcode ('shenyang'));
</script>
Результат работы: 899755
Хорошо, так же, как и результат расчета Java. Я думал, что это будет сделано, и тогда я подумал о том, чтобы найти строку, чтобы проверить ее:
«Шеньян, Шеньян», результат бега в Java: 1062711668, но он становится: 268325154444 в JS.
Я так ужасен, есть проблема с этим только одной попытки! Подумав на мгновение, я внезапно понял, что длина int в Java, кажется, составляет около 2,1 миллиарда, и в JS нет такого ограничения. Проблема должна быть здесь, поэтому я внес некоторые изменения в предыдущий метод:
Кода -копия выглядит следующим образом:
<Скрипт>
функция HashCode (str) {
var h = 0, off = 0;
var len = str.length;
для (var i = 0; i <len; i ++) {
h = 31 * h+str.charcodeat (off ++);
}
var t = -2147483648*2;
while (h> 2147483647) {
H+= T.
}
возврат H;
}
Alert (Hashcode ('Shenyang Shenyang')); </script>
Проверьте! ХОРОШО! Миссия выполнена. Нет технического контента, небольшое резюме
Обновленный на 2013-02-19, вышеуказанный относительно неэффективен и будет развеян, когда контент очень длинный. Следующий код является оптимизированным кодом:
Кода -копия выглядит следующим образом:
<Скрипт>
функция HashCode (str) {
var h = 0;
var len = str.length;
var t = 2147483648;
для (var i = 0; i <len; i ++) {
h = 31 * h + str.charcodeat (i);
if (h> 2147483647) h %= t; // java int переполняет модуль
}
/ * var t = -2147483648 * 2;
while (h> 2147483647) {
H += T.
}*/
возврат H;
}
Alert (hashcode ('c# Как выполнять n потоков одновременно одновременно, остальные реализованы в очереди')); // 1107373715
</script>