У меня есть следующий класс Util для crc32 расчета:расчет Java CRC32 в многопоточной envirinment
import java.util.zip.CRC32;
import java.util.zip.Checksum;
public class StringUtils {
public static long crc32(String input) {
byte[] bytes = input.getBytes();
Checksum checksum = new CRC32();
checksum.update(bytes, 0, bytes.length);
return checksum.getValue();
}
}
Производительность является очень важным критерием для меня.
Прямо сейчас я думаю о возможном рефакторинга этого метода, и я думаю, чтобы переместить checksum
на уровне класса, как статическое поле ... что-то вроде этого:
public class StringUtils {
public static Checksum checksum = new CRC32();
public static long crc32(String input) {
byte[] bytes = input.getBytes();
checksum.update(bytes, 0, bytes.length);
return checksum.getValue();
}
}
, но я m не уверен, что он будет корректно работать в параллельной многопоточной среде. Пожалуйста, посоветуйте - такой рефакторинг - хорошая идея или нет.
Вы не должны этого делать, потому что, даже игнорируя многопоточность, 'getValue' не сбрасывает данные CRC32, загруженные во время предыдущих вызовов на' crc32'. Вам нужно будет использовать метод ['reset'] (https://docs.oracle.com/javase/8/docs/api/java/util/zip/CRC32.html#reset--) либо в начале или конец метода 'crc32'. –