Ноль изобретательности Пожалуйста, указывайте первоисточник для перепечатки, спасибо!
иллюстрировать
Часть 1RocketMQ (2): связь RPCВведены некоторые детали RPC RocketMQ, На самом деле, это не только содержимое RocketMQ, любой коммуникационный модуль в основном похож, этот контент очень общедоступен, давайте посмотрим сегодняпроверка CRC, что также технология, часто используемая в модулях связи.
Введение в CRC
CRC — это [код проверки циклическим избыточным кодом]:Это наиболее часто используемый код проверки ошибок в области передачи данных., отличающийся тем, что длина информационного поля и контрольного поля может быть выбрана произвольно. Cyclic Redundancy Check (CRC) — это функция обнаружения ошибок передачи данных, которая выполняет полиномиальное вычисление данных и прикрепляет полученный результат к задней части кадра.Приемное устройство также выполняет аналогичный алгоритм для обеспечения правильности и целостности передачи данных. секс.
CRC32 обладает сильной способностью обнаружения ошибок и низкими накладными расходами, и его легко реализовать с помощью кодировщика и схемы обнаружения. Судя по его способности обнаруживать ошибки, вероятность ошибок, которые он не может найти, составляет менее 0,0047%. С точки зрения производительности и накладных расходов он намного превосходит проверку четности и проверку арифметической суммы. Таким образом, в области хранения и передачи данных CRC используется повсюду: FCS (последовательность обнаружения ошибок кадра) известного протокола связи X.25 использует CRC-CCITT, а программное обеспечение инструментов сжатия, такое как ARJ и LHA, использует CRC32. Чтение и запись диска использует CRC16, а распространенные форматы хранения изображений, такие как GIF и TIFF, также используют CRC в качестве метода обнаружения ошибок.
Использование CRC
public static void main(String[] args) {
int crc = crc32("欢迎关注:匠心零度".getBytes());
int crc1 = crc32("欢迎关注:匠心零度".getBytes());
int crc2 = crc32("欢迎关注:匠心零度!".getBytes());
System.out.println(crc==crc1);
System.out.println(crc== crc2);
}
public static int crc32(byte[] array) {
if (array != null) {
return crc32(array, 0, array.length);
}
return 0;
}
public static int crc32(byte[] array, int offset, int length) {
CRC32 crc32 = new CRC32();
crc32.update(array, offset, length);
return (int) (crc32.getValue() & 0x7FFFFFFF);
}
Выходной результат:
true
false
Часть RocketMQ использует
crc32 Внутренняя реализация JDK
В результате многократного сдвига и деления CRC окончательное значение в этом регистре является остатком, который нам нужен.
Примечание:Конкретные детали реализации подробно не разбираются, если вам нужно знать, пожалуйста, изучите это самостоятельно.
Если вы чувствуете себя вознагражденным после прочтения, пожалуйста, подпишитесь и добавьте официальную учетную запись [Ingenuity Zero], чтобы узнать больше захватывающей истории! ! !
Присоединяйтесь к Планете Знаний и обсуждайте вместе!