Метод должен работать нормально, независимо от того, что вы дадите - если вы получаете неправильные результаты, я подозреваю, что вы загружаете файл неправильно. Пожалуйста, покажите этот код, и мы поможем вам разобраться, что происходит не так.
С точки зрения кода, эта строка:
int v = hash[i] & 0xFF;
в основном используется для обработки байта как беззнакового. Байты подписаны в Java - признанная ошибка проектирования в языке - но мы хотим распечатать шестнадцатеричное значение, как если бы оно было целым числом без знака. Побитовое И только с младшими 8 битами эффективно преобразует его в целочисленное значение байта, обработанного как беззнаковый.
(Есть лучшие способы преобразовать байтовый массив в шестнадцатеричную строку, но это отдельный вопрос.)