Мой вопрос касается кода, который генерирует хэш-значения для строк, суммируя по 4 байта за раз. Он полностью работает, но я не могу понять некоторые строки этого кода, а именно идею, которая выполняется в некоторых строках. Поэтому мне нужна помощь некоторых из вас, которые знакомы с хэшированием.Хеширование строк в Java
Ну это полный код:
long sfold(String s, int M) {
int intLength = s.length()/4;
long sum = 0;
for (int j = 0; j < intLength; j++) {
char c[] = s.substring(j * 4, (j * 4) + 4).toCharArray();
long mult = 1;
for (int k = 0; k < c.length; k++) {
sum += c[k] * mult;
mult *= 256;
}
}
char c[] = s.substring(intLength * 4).toCharArray();
long mult = 1;
for (int k = 0; k < c.length; k++) {
sum += c[k] * mult;
mult *= 256;
}
return(Math.abs(sum) % M);
}
Здесь каждый символьное значение преобразуется в длинное целое типа, подводя результат на каждой итерации для цикла. Эти 2 сомнительные строки кода, которые я уже упоминал выше, являются следующие:
sum += c[k] * mult;
mult *= 256;
Ну, я могу понять весь код, за исключением этих 2-х линий ...
1) Почему нам нужна переменная «Mult» ? Возможно ли это использование метода умножения для хеширования?
2) Почему мы умножаем «мульти» точно на 256 на каждой итерации? Что такое 256 в этом случае?
Если некоторые из вас сталкивались с этим кодом, или вы знаете, идея, которая выполняется в этих строках, пожалуйста, помогите мне понять это тоже :)
Благодарим вас за такое прекрасное объяснение! Я, наконец, понял. Но у меня есть только дополнительный вопрос. Если мы используем unsigned int вместо char, поэтому нам нужно умножить на 65536, правильно? –
, если он находится в java, тогда вам нужно 4294967294 (java int is 32 bits), но java не имеет unsingned ints. Всегда лучше использовать '1 << 8' или' 1 << k' для этого короля операции ('1 << 8 = 256'); – Desert
Да, вы правы, я ошибся, написал около 16 бит (например, короткий). Но идея правильная, не так ли? Поэтому мы умножаемся на 65536, и мы переходим к следующей позиции. –