Контролни суми в Java

Java Top

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА

1. Общ преглед

В тази мини-статия ще предоставим кратко обяснение какво представляват контролните суми и ще покажем как да използваме някои от вградените функции на Java за изчисляване на контролни суми .

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

По същество контролната сума е умалено представяне на двоичен поток от данни.

Контролните суми обикновено се използват за мрежово програмиране, за да се провери дали е получено пълно съобщение. След получаване на ново съобщение контролната сума може да бъде преизчислена и сравнена с получената контролна сума, за да се гарантира, че не са загубени битове. Освен това те могат да бъдат полезни и за управление на файлове, например за сравняване на файлове или за откриване на промени.

Има няколко често срещани алгоритми за създаване на контролни суми, като Adler32 и CRC32 . Тези алгоритми работят чрез преобразуване на поредица от данни или байтове в много по-малка последователност от букви и цифри. Те са проектирани така, че всяка малка промяна във входа ще доведе до значително различна изчислена контролна сума.

Нека да разгледаме поддръжката на Java за CRC32. Имайте предвид, че докато CRC32 може да бъде полезен за контролни суми, не се препоръчва за сигурни операции, като хеширане на парола.

3. Контролна сума от низ или байтов масив

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

Ако започваме със String , можем да използваме метода getBytes () , за да получим байтов масив от String :

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 . След като обект от класа, ние използваме актуализация метода за актуализиране на контролна инстанция с байтове от входа.

Най-просто казано, методът за актуализация замества байтовете, държани от обекта CRC32 - това помага при повторното използване на кода и отрича необходимостта от създаване на нови екземпляри на контролна сума. Класът CRC32 предоставя няколко заменени метода, които заменят или целия байтов масив, или няколко байта в него.

И накрая, след задаване на байтовете , ние експортираме контролната сума с метода getValue .

4. Контролна сума от InputStream

Когато се работи с по-големи набори от данни с двоични данни, горният подход не би бил много ефективен за паметта, тъй като всеки байт се зарежда в паметта .

Когато имаме 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 , като използваме CRC32 поддръжката на Java.

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

Дъно на Java

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА