Как обрабатывать значение байта как int в java

Я пытаюсь выполнить вычисление хэш-кода вручную для строки, поскольку в нем говорится, что формула для строкового хэш-кода выглядит как «s[0]*31^(n-1) + s[1]*31^(n-2) +... + s[n-1]", как показано ниже

    public static void main(String[] args) {

        String str1 = new String("A");

        double hc = 0;
        for (int i = 0; i < str1.length(); i++) {
            int iv = (byte) str1.charAt(i);
            hc = hc + Math.pow((iv * 31), (str1.length() - 1 - i));
        }

        System.out.println(hc);              // 1.0
        System.out.println(str1.hashCode()); // 65
    }

Значение «hc» равно 1,0, потому что java преобразует byte в значение int в соответствии с правилами. но ответ, который я ищу, - 65. Как скопировать значение байта как есть в переменную int.


person Murali    schedule 07.08.2019    source источник
comment
Подсказка: щелкните, удерживая нажатой клавишу Ctrl или Cmd, hashCode() в вашей среде IDE, и это должно привести вас к исходному коду. У вас будет ответ там. Нигде не сказано, что символы преобразуются в байты. Зачем ты это делаешь?   -  person JB Nizet    schedule 07.08.2019
comment
Может быть, вы думаете, что строки состоят из байтов? Это не так, они состоят из chars шириной 16 бит.   -  person DodgyCodeException    schedule 07.08.2019
comment
Вместо String str1 = new String("A"); вы должны просто сделать String str1 = "A";.   -  person DodgyCodeException    schedule 07.08.2019
comment
@JBNizet Я хочу закодировать это вручную, в основном хочу знать, как скопировать значение байта как есть в переменную int .. Я не нашел его в исходном коде. Спасибо   -  person Murali    schedule 07.08.2019
comment
@DodgyCodeException, я знаю, что строки состоят из символов. String str1 = "A"; это не поможет, дает тот же результат, что и выше   -  person Murali    schedule 07.08.2019
comment
int value = s.charAt(i);. Ваш алгоритм просто неверен. Посмотрите исходный код для правильного, простого алгоритма.   -  person JB Nizet    schedule 07.08.2019
comment
Извините, я должен был четко указать, что String str1 = "A"; был просто предложением более четкого и эффективного кода, а не ответом на решение вашей проблемы.   -  person DodgyCodeException    schedule 07.08.2019


Ответы (1)


Итак, насколько я вижу, вы ошибаетесь в функции, что я имею в виду:

Math.pow((iv * 31), (str1.length() - 1 - i)) 

равно => (65 * 31) ^ (1 [длина строки] - 1 - 0 [значение i])

что дает что-то вроде (65*31) ^ 0 что дает 1, но вы ищете выражение 65 * (31 ^ 0) [в заключение], поэтому функция должна выглядеть так

Math.pow((31), (str1.length() - 1 - i)) * iv 

что я собираюсь дать 65

person F0urth    schedule 07.08.2019