Java >> Java tutorial >  >> Java

Introduktion til hashing i Java

Hash-funktioner er en grundlæggende del af computing, og Java giver fremragende support til at arbejde med dem. I Java, hashing er en almindelig måde at gemme data på i samlinger såsom et HashMap og HashSet . Denne programmeringsvejledning taler om hashing, dets fordele og ulemper, og hvordan du kan arbejde med det i Java.

Hvad er hashing?

Hashing er defineret som processen med at transformere en værdi til en anden baseret på en bestemt nøgle. En hash er en funktion, der konverterer en inputværdi til en outputværdi, der normalt er kortere, og er designet til at være unik for hver inputværdi. Selvom kollisioner er uundgåelige, bør din hash-funktion forsøge at reducere kollisioner, hvilket indebærer, at forskellige inputværdier ikke bør generere den samme hashkode.

Hashes bruges i mange forskellige applikationer, såsom lagring af adgangskoder, oprettelse af unikke identifikatorer og verificering af data. En hash-funktion producerer det, der er kendt som en hash-værdi , en hash-kode , eller en hash. En hash-tabel er en datastruktur, der gemmer nøgleværdi par, hvor hver nøgle bruges til at beregne et indeks i tabellen, der svarer til placeringen af ​​værdien.

Hash-funktioner bruges i computerprogrammering til forskellige formål, såsom lagring af data i en database eller verifikation af dataintegritet. Hashing bruges til at sikre legitimationsoplysninger; for eksempel adgangskoder, før de gemmes i datalageret. Når en bruger indtaster sin adgangskode, opretter en hash-funktion en hash-kode ud fra adgangskoden. For at bekræfte den adgangskode, som brugeren har indtastet, sammenlignes denne genererede hashkode med den gemte hashkode.

Selvom der er flere typer hash-funktioner, accepterer de alle et input med fast størrelse og producerer et output med fast størrelse. Outputstørrelsen er normalt mindre end inputstørrelsen, hvilket gør hashing til en pladseffektiv måde at gemme data på.

Hash-funktioner er designet til at være envejsfunktioner, hvilket betyder, at det burde være meget vanskeligt at beregne det originale input fra outputtet (hash-kode). Ikke desto mindre kan kollisioner forekomme, hvis to forskellige input resulterer i samme output.

Typer af hashing-algoritmer i Java

Der er flere hashing-algoritmer – de mest almindelige er:MD5 , SHA-1 og SHA-256 . Disse algoritmer bruges til at generere en hash af et givet stykke data, som derefter kan bruges til at verificere integriteten af ​​disse data.

For eksempel kan du udnytte en hash-algoritme til at generere en hash af filen. Hvis filen ændres, og en hash genereres igen, vil den nye hashværdi afvige fra den tidligere hashværdi. Dette kan hjælpe dig med at bekræfte, om en fil er blevet manipuleret.

Hvad er fordelene og ulemperne ved hashing

Den største fordel ved hashing er, at den kan bruges til at gemme data af enhver størrelse på en relativt lille mængde plads. Dataene gemmes i en "hash-tabel" , som er en samling af dataværdier, der hver er tildelt en unik nøgle. Når du vil hente dataene, angiver du blot nøglen, og hashtabellen slår den tilknyttede værdi op.

Den største ulempe ved hashing er, at det kan være svært at hente data, hvis du ikke kender den nøjagtige nøgle, der blev brugt til at gemme dataene. Dette kan være et problem, hvis du forsøger at gendanne tabte data, eller hvis du vil finde alle de data, der matcher et bestemt kriterium. Desuden, hvis to stykker data har den samme nøgle, vil kun den ene blive gemt i hash-tabellen, hvilket resulterer i datatab.

Hashing vil ikke være effektivt, hvis der opstår kollisioner, hvilket betyder, at to eller flere elementer er tildelt den samme nøgle. Derudover kan hash-funktioner være komplekse, og dataene i en hash-tabel skal organiseres omhyggeligt, så nøglerne hurtigt kan findes.

Sådan vælger du en Java Hashing-algoritme

Du bør overveje et par punkter, før du vælger en hashing-algoritme til din applikation. Det første punkt er sikkerheden, du bør vælge en algoritme, der er svær at bryde. Den anden er algoritmens hastighed - du bør vælge en algoritme, der er højtydende. Den tredje er størrelsen af ​​input:du skal vælge en algoritme, der kan håndtere størrelsen af ​​de data, du skal hash.

De mest populære hashing-algoritmer er SHA-1 , SHA-256 og SHA-512 . Alle disse algoritmer er sikre og hurtige og kan håndtere store mængder data.

HashMap og HashSet i Java

Java giver flere måder at implementere hashing på. Nogle af de mest populære måder er at bruge HashMap og HashSet klasser. Både HashMap og HashSet klasser bruger hashing-algoritmer til at gemme og hente data.

HashMap

HashMap klasse er en del af Java Collections Framework . Den gemmer data repræsenteret som nøgleværdi-par, hvor nøglerne er ikke-nul og unikke; for eksempel er duplikerede nøgler ikke tilladt.

HashSet

HashSet klasse er også en del af Java Collections Framework. Det gemmer data i et sæt, hvilket betyder, at det ligner HashMap , ville det ikke tillade duplikerede værdier. Men i modsætning til HashMap klasse, HashSet klasse gemmer ikke data i nøgleværdi-par.

Sådan programmeres hashing i Java

Der er mange måder at hash på i Java. Nogle af de mest almindelige metoder er at bruge den indbyggede hashCode metode. For at hash en streng ved hjælp af den indbyggede hashCode metode, kan du bruge følgende kode:

String str = "Hello, world!"; 
int hash = str.hashCode();

For at hash en streng ved hjælp af SHA-256 hashing-algoritme, kan du bruge følgende kode:

String str = "Hello, world!"; 
String algorithm = "SHA-256"; 
byte[] bytes = Hashing.digest(algorithm, str.getBytes()).asBytes();

Følgende kodeliste viser, hvordan du kan generere hash-kode til variabler i Java. Bemærk, at hash-koden for str1 og str2 vil afvige, men hash-koden for str3 og str4 vil være identisk:

import java.io.*;
public class Test {
    public static void main(String args[]) {
      String str1 = "Hello";
      String str2 = "World!";
      System.out.println("The hash code of str1 is: " + str1.hashCode());
      System.out.println("\nThe hash code of str2 is: " + str2.hashCode());
      String str3 = "Same value";
      String str4 = "Same value";
       System.out.println("The hash code of str3 is: " + str3.hashCode());
      System.out.println("\nThe hash code of str4 is: " + str4.hashCode());
   }
}

Sidste tanker om hashing i Java

I denne programmeringsvejledning undersøgte vi hashing, dets typer, fordele og hvordan man arbejder med hashing i Java. Vi har også set på, hvordan man bruger et salt til at forbedre sikkerheden for dine hashes. Ved at forstå, hvordan hashing fungerer, kan du træffe mere informerede valg om, hvilken algoritme der passer bedst til dine behov.


Java tag