Prüfsummen in Java

Java Top

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs

1. Übersicht

In diesem Mini-Artikel erklären wir kurz, was Prüfsummen sind, und zeigen, wie einige der in Java integrierten Funktionen zur Berechnung von Prüfsummen verwendet werden .

2. Prüfsummen und allgemeine Algorithmen

Eine Prüfsumme ist im Wesentlichen eine minimierte Darstellung eines binären Datenstroms.

Prüfsummen werden üblicherweise für die Netzwerkprogrammierung verwendet, um zu überprüfen, ob eine vollständige Nachricht empfangen wurde. Beim Empfang einer neuen Nachricht kann die Prüfsumme neu berechnet und mit der empfangenen Prüfsumme verglichen werden, um sicherzustellen, dass keine Bits verloren gegangen sind. Darüber hinaus können sie auch für die Dateiverwaltung nützlich sein, um beispielsweise Dateien zu vergleichen oder Änderungen zu erkennen.

Es gibt verschiedene gängige Algorithmen zum Erstellen von Prüfsummen, z. B. Adler32 und CRC32 . Diese Algorithmen konvertieren eine Folge von Daten oder Bytes in eine viel kleinere Folge von Buchstaben und Zahlen. Sie sind so konzipiert, dass jede kleine Änderung der Eingabe zu einer stark unterschiedlichen berechneten Prüfsumme führt.

Werfen wir einen Blick auf die Unterstützung von Java für CRC32. Beachten Sie, dass CRC32 zwar für Prüfsummen nützlich sein kann, für sichere Vorgänge wie das Hashing eines Kennworts jedoch nicht empfohlen wird.

3. Prüfsumme aus einem String- oder Byte-Array

Das erste, was wir tun müssen, ist, die Eingabe für den Prüfsummenalgorithmus zu erhalten.

Wenn wir mit einem String beginnen , können wir die Methode getBytes () verwenden, um ein Byte-Array aus einem String abzurufen :

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

Als nächstes können wir die Prüfsumme mit dem Byte-Array berechnen:

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

Hier verwenden wir die in Java integrierte CRC32- Klasse. Sobald die Klasse instanziiert ist, verwenden wir die Aktualisierungsmethode , um die Prüfsummeninstanz mit den Bytes von der Eingabe zu aktualisieren .

Einfach ausgedrückt, ersetzt die Aktualisierungsmethode die vom CRC32- Objekt gehaltenen Bytes. Dies hilft bei der Wiederverwendung von Code und macht das Erstellen neuer Instanzen von Prüfsumme überflüssig. Die CRC32- Klasse bietet einige überschriebene Methoden, um entweder das gesamte Byte-Array oder einige Bytes darin zu ersetzen.

Nachdem wir die Bytes festgelegt haben , exportieren wir die Prüfsumme mit der Methode getValue .

4. Prüfsumme aus einem InputStream

Wenn es sich um größere Datensätze von Binärdaten handelt, wäre der obige Ansatz nicht sehr speichereffizient, da jedes Byte in den Speicher geladen wird .

Wenn wir einen InputStream haben , können wir CheckedInputStream verwenden , um unsere Prüfsumme zu erstellen . Mit diesem Ansatz können wir definieren, wie viele Bytes gleichzeitig verarbeitet werden.

In diesem Beispiel verarbeiten wir jeweils eine bestimmte Anzahl von Bytes, bis wir das Ende des Streams erreichen.

Der Prüfsummenwert ist dann im CheckedInputStream verfügbar :

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. Schlussfolgerung

In diesem Tutorial sehen wir uns an, wie Prüfsummen aus Byte-Arrays und InputStreams mithilfe der CRC32-Unterstützung von Java generiert werden .

Wie immer ist der Code auf GitHub verfügbar.

Java unten

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs