Беззнаковые байты CRC32 в Java

Я пытаюсь воспроизвести хеш-функцию CRC32, доступную в PHP, на Java. Существующий класс CRC32 в Java возвращает другой хэш, и я полагаю, что это связано с тем, что байты Java в моем массиве байтов беззнаковые от -128 до 128 вместо 0-255.

Чего я не могу понять, так это того, как обойти эту ситуацию. Я рассматривал использование UnsignedBytes в Guava, но не могу найти метод хеширования, который принимает его в качестве аргумента. Я мог бы использовать это, чтобы написать свою собственную хеш-функцию, но, честно говоря, я недостаточно разбираюсь в том, как она работает, или в побитовой арифметике в целом, чтобы сделать это правдоподобным.

Проще говоря, я пытаюсь, чтобы CRC32 имел строку и возвращал десятичное представление.


person Nick    schedule 20.02.2013    source источник


Ответы (1)


CRC не заботится о знаке.

CRC32 Java дал мне тот же результат, что и PHP.

public static void main(String[] args) {
    String a = "Hello World!";
    CRC32 crc = new CRC32();
    crc.update(a.getBytes());
    System.out.println(Long.toHexString(crc.getValue()));
}

Выходы: 1c291ca3

Использование этого онлайн-калькулятора PHP CRC32 дало то же значение CRC, что и приведенный выше код Java.

person m0skit0    schedule 20.02.2013
comment
Спасибо. Глупая ошибка. Значение, которое я просматривал в своем наборе тестовых данных, было последним значением, и я не вызывал crc.reset() в конце своего цикла, и я не до конца понимал, что делает update(). - person Nick; 20.02.2013