Рубрики
Без рубрики

Контрольные суммы в Java

Узнайте, как создавать контрольные суммы в Java

Автор оригинала: Sam Millington.

1. Обзор

В этой мини-статье мы дадим краткое объяснение того, что такое контрольные суммы, и покажем, как использовать некоторые встроенные функции Java для вычисления контрольных сумм .

2. Контрольные суммы и общие алгоритмы

По сути, контрольная сумма – это уменьшенное представление двоичного потока данных.

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

Существует несколько распространенных алгоритмов создания контрольных сумм, таких как Adler32 и CRC32 . Эти алгоритмы работают путем преобразования последовательности данных или байтов в гораздо меньшую последовательность букв и цифр. Они сконструированы таким образом, что любое небольшое изменение входных данных приведет к совершенно другой вычисленной контрольной сумме.

Давайте посмотрим на поддержку Java для CRC32. Обратите внимание, что, хотя CRC32 может быть полезен для контрольных сумм, он не рекомендуется для безопасных операций, таких как хеширование пароля .

3. Контрольная сумма Из Массива строк или байтов

Первое, что нам нужно сделать, это получить входные данные для алгоритма контрольной суммы.

Если мы начинаем с String , мы можем использовать метод getBytes () , чтобы получить массив байтов из строки :

String test = "test";
byte[] bytes = test.getBytes();

Затем мы можем вычислить контрольную сумму, используя массив байтов:

public static long getCRC32Checksum(byte[] bytes) {
    Checksum crc32 = new CRC32();
    crc32.update(bytes, 0, bytes.length);
    return crc32.getValue();
}

Здесь мы используем встроенный в Java класс CRC32 . После создания экземпляра класса мы используем метод update для обновления экземпляра контрольной суммы байтами из входных данных.

Проще говоря, метод update заменяет байты, удерживаемые объектом CRC32 – это помогает при повторном использовании кода и устраняет необходимость создания новых экземпляров контрольной суммы . Класс CRC32 предоставляет несколько переопределенных методов для замены либо всего массива байтов, либо нескольких байтов в нем.

Наконец, после установки байтов , мы экспортируем контрольную сумму с помощью метода GetValue .

4. Контрольная сумма Из входного потока

При работе с большими наборами двоичных данных описанный выше подход не будет очень эффективным с точки зрения памяти, поскольку каждый байт загружается в память .

Когда у нас есть InputStream , мы можем использовать CheckedInputStream для создания нашей контрольной суммы . Используя этот подход, мы можем определить, сколько байтов обрабатывается в любой момент времени.

В этом примере мы обрабатываем заданное количество байтов в то время, пока не достигнем конца потока.

Значение контрольной суммы затем доступно из CheckedInputStream :

public static long getChecksumCRC32(InputStream stream, int bufferSize) 
  throws IOException {
    CheckedInputStream checkedInputStream = new CheckedInputStream(stream, new CRC32());
    byte[] buffer = new byte[bufferSize];
    while (checkedInputStream.read(buffer, 0, buffer.length) >= 0) {}
    return checkedInputStream.getChecksum().getValue();
}

5. Заключение

В этом уроке мы рассмотрим, как генерировать контрольные суммы из байтовых массивов и InputStream s, используя поддержку CRC32 Java.

Как всегда, код доступен на GitHub .