Kontrolsummer i Java

Java Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Oversigt

I denne mini-artikel giver vi en kort forklaring på, hvad kontrolsummer er, og viser, hvordan man bruger noget af Java's indbyggede funktioner til beregning af kontrolsummer.

2. Kontrolsummer og almindelige algoritmer

I det væsentlige et kontrolsum er en formindsket gengivelse af en binær datastrøm.

Kontrollsummer bruges ofte til netværksprogrammering for at kontrollere, at en komplet besked er modtaget. Efter modtagelse af en ny meddelelse kan kontrolsummen beregnes igen og sammenlignes med den modtagne kontrolsum for at sikre, at ingen bits er gået tabt. Derudover kan de også være nyttige til filhåndtering, for eksempel til at sammenligne filer eller til at opdage ændringer.

Der er flere almindelige algoritmer til oprettelse af kontrolsummer, såsom Adler32 og CRC32. Disse algoritmer fungerer ved at konvertere en sekvens af data eller bytes til en meget mindre sekvens af bogstaver og tal. De er designet således, at enhver lille ændring i input vil resultere i en meget forskellig beregnet kontrolsum.

Lad os se på Java's support til CRC32. Bemærk, at selvom CRC32 kan være nyttigt til kontrolsummer, anbefales det ikke til sikre operationer, som f.eks. Hashing af en adgangskode.

3. Kontrolsum fra en streng eller en byte-array

Den første ting, vi skal gøre er at få input til kontrolsummealgoritmen.

Hvis vi starter med en Snor, kan vi bruge getBytes () metode til at få et byte array fra en Snor:

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

Dernæst kan vi beregne kontrolsummen ved hjælp af byte-arrayet:

offentlig statisk lang getCRC32Checksum (byte [] bytes) {Checksum crc32 = ny CRC32 (); crc32.update (bytes, 0, bytes.length); returnere crc32.getValue (); }

Her bruger vi Java's indbyggede CRC32 klasse. Når klassen er instantificeret, bruger vi opdatering metode til at opdatere Kontrolsum eksempel med bytes fra input.

Kort sagt, den opdatering metoden erstatter de bytes, der er indeholdt i CRC32Objekt - dette hjælper med genbrug af kode og negerer behovet for at oprette nye forekomster af Kontrolsum. Det CRC32 klasse giver et par tilsidesatte metoder til at erstatte enten hele byte-arrayet eller et par bytes i det.

Endelig efter indstilling af bytes, vi eksporterer kontrolsummen med getValue metode.

4. Kontrolsum Fra en InputStream

Når man handler med større datasæt med binære data ville ovenstående fremgangsmåde ikke være særlig hukommelseseffektiv, da hver byte indlæses i hukommelsen.

Når vi har en InputStream, vi kan vælge at bruge CheckedInputStream for at oprette vores kontrolsum. Ved at bruge denne tilgang kan vi definere, hvor mange byte der behandles ad gangen.

I dette eksempel behandler vi en given mængde bytes ad gangen, indtil vi når slutningen af ​​strømmen.

Kontrolsummen er derefter tilgængelig fra CheckedInputStream:

offentlig statisk lang getChecksumCRC32 (InputStream stream, int bufferSize) kaster IOException {CheckedInputStream checkedInputStream = ny CheckedInputStream (stream, ny CRC32 ()); byte [] buffer = ny byte [bufferSize]; mens (checkedInputStream.read (buffer, 0, buffer.length)> = 0) {} returnerer checkInputStream.getChecksum (). getValue (); }

5. Konklusion

I denne vejledning ser vi på, hvordan man genererer kontrolsummer fra byte-arrays og InputStreams bruger Java's CRC32 support.

Som altid er koden tilgængelig på GitHub.

Java bund

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN