Chequesommen in Java

Java Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Overzicht

In dit mini-artikel geven we een korte uitleg van wat checksums zijn en laten we zien hoe je sommige van Java's ingebouwde functies voor het berekenen van checksums.

2. Checksums en algemene algoritmen

Eigenlijk, een checksum is een verkleinde weergave van een binaire gegevensstroom.

Checksums worden vaak gebruikt voor netwerkprogrammering om te controleren of een volledig bericht is ontvangen. Bij ontvangst van een nieuw bericht kan de checksum opnieuw worden berekend en vergeleken met de ontvangen checksum om er zeker van te zijn dat er geen bits verloren zijn gegaan. Daarnaast kunnen ze ook handig zijn voor bestandsbeheer, bijvoorbeeld om bestanden te vergelijken of om wijzigingen op te sporen.

Er zijn verschillende algemene algoritmen voor het maken van checksums, zoals Adler32 en CRC32. Deze algoritmen werken door een reeks gegevens of bytes om te zetten in een veel kleinere reeks letters en cijfers. Ze zijn zo ontworpen dat elke kleine wijziging in de invoer zal resulteren in een enorm andere berekende checksum.

Laten we eens kijken naar Java's ondersteuning voor CRC32. Merk op dat hoewel CRC32 handig kan zijn voor checksums, het niet wordt aanbevolen voor veilige bewerkingen, zoals het hashen van een wachtwoord.

3. Checksum van een string of byte-array

Het eerste dat we moeten doen, is de invoer voor het checksum-algoritme verkrijgen.

Als we beginnen met een Draad, kunnen we de getBytes () methode om een ​​byte-array op te halen uit een Draad:

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

Vervolgens kunnen we de checksum berekenen met behulp van de byte-array:

openbare statische lang getCRC32Checksum (byte [] bytes) {Checksum crc32 = nieuwe CRC32 (); crc32.update (bytes, 0, bytes.length); retourneer crc32.getValue (); }

Hier gebruiken we Java's ingebouwde CRC32 klasse. Zodra de klasse is geïnstantieerd, gebruiken we de bijwerken methode om het Checksum instantie met de bytes van de invoer.

Simpel gezegd, de bijwerken methode vervangt de bytes die worden vastgehouden door de CRC32Voorwerp - dit helpt bij het hergebruik van code en maakt de noodzaak om nieuwe exemplaren van Checksum. De CRC32 class biedt een paar overschreven methoden om ofwel de hele byte-array of een paar bytes erin te vervangen.

Eindelijk, na het instellen van de bytes, we exporteren de checksum met de getValue methode.

4. Checksum van een InputStream

Als het gaat om met grotere gegevenssets van binaire gegevens zou de bovenstaande benadering niet erg geheugenefficiënt zijn, aangezien elke byte in het geheugen wordt geladen.

Als we een InputStream, kunnen we ervoor kiezen om CheckedInputStream om onze checksum te creëren. Door deze benadering te gebruiken, kunnen we bepalen hoeveel bytes er tegelijkertijd worden verwerkt.

In dit voorbeeld verwerken we een bepaald aantal bytes tegelijk totdat we het einde van de stream bereiken.

De checksum-waarde is dan beschikbaar via de CheckedInputStream:

openbare statische lange getChecksumCRC32 (InputStream stream, int bufferSize) gooit IOException {CheckedInputStream checkedInputStream = nieuwe CheckedInputStream (stream, nieuwe CRC32 ()); byte [] buffer = nieuwe byte [bufferSize]; while (checkInputStream.read (buffer, 0, buffer.length)> = 0) {} return checkInputStream.getChecksum (). getValue (); }

5. Conclusie

In deze tutorial bekijken we hoe we checksums kunnen genereren uit byte-arrays en InputStreams met behulp van Java's CRC32-ondersteuning.

Zoals altijd is de code beschikbaar op GitHub.

Java onderkant

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS