CodeGym /Java Blog /Random /Java hashCode()
John Squirrels
Antas
San Francisco

Java hashCode()

Nai-publish sa grupo

Prinsipyo ng Hash

Una sa lahat, bago natin tukuyin ang Java hashcode, kailangan nating maunawaan kung ano ang hashing at para saan ito. Ang pag-hash ay isang proseso ng paglalapat ng hash function sa ilang data. Ang hash function ay isang mathematical function lamang. Huwag mag-alala tungkol dito! Ang "matematika" ay hindi palaging nangangahulugang "kumplikado". Dito ay nangangahulugan lamang na mayroon kaming ilang data at isang tiyak na panuntunan na nagmamapa ng data sa isang hanay ng mga character (code). Halimbawa, maaaring ito ay isang hexadecimal cipher. Mayroon kaming ilang data ng anumang laki sa input, at maglapat ng hash function dito. Sa output, nakakakuha kami ng fixed-size na data, halimbawa, 32 character. Karaniwan, ang ganitong uri ng function ay nagko-convert ng isang malaking piraso ng data sa isang maliit na halaga ng integer. Ang resulta ng gawaing ito ay tinatawag na hash code. Ang mga hash function ay malawakang ginagamit sa cryptography, at ilang iba pang mga lugar. Maaaring magkaiba ang mga function ng hash,
  • Ang isang partikular na bagay ay may partikular na hashcode.
  • Kung magkapareho ang dalawang bagay, magkapareho ang kanilang mga hashcode. Ang kabaligtaran ay hindi totoo.
  • Kung magkaiba ang mga hash code, siguradong hindi pantay ang mga bagay.
  • Maaaring may parehong hash code ang iba't ibang bagay. Gayunpaman, ito ay isang napaka-hindi malamang na kaganapan. Sa puntong ito, mayroon tayong banggaan, isang sitwasyon, kung saan maaari tayong mawalan ng data.
Ang "tamang" hash function ay nagpapaliit sa posibilidad ng mga banggaan.

Hashcode sa Java

Sa Java hash function ay karaniwang konektado sa hashCode() method . Eksakto, ang resulta ng paglalapat ng hash function sa isang Object ay hashcode. Ang bawat Java object ay may hash code. Sa pangkalahatan, ang Hash Code ay isang numero na kinakalkula ng hashCode() na paraan ng Objectklase. Karaniwan, ina-override ng mga programmer ang pamamaraang ito para sa kanilang mga bagay pati na rin ang nauugnay sa hashCode() ang equals() na pamamaraan para sa mas mahusay na pagproseso ng partikular na data. Ang hashCode() method ay nagbabalik ng int (4 bytes) na halaga, na isang numeric na representasyon ng object. Ang hashcode na ito ay ginagamit, halimbawa, ng mga koleksyon para sa mas mahusay na pag-imbak ng data at, nang naaayon, mas mabilis na pag-access sa mga ito. Bilang default, ang hashCode()function para sa isang bagay ay nagbabalik ng bilang ng memory cell kung saan naka-imbak ang bagay. Samakatuwid, kung walang pagbabagong ginawa sa code ng aplikasyon, dapat ibalik ng function ang parehong halaga. Kung bahagyang nagbabago ang code, nagbabago rin ang halaga ng hashcode. Para saan ang hashcode na ginagamit sa Java? Una sa lahat, ang Java hashcode ay tumutulong sa mga programa na tumakbo nang mas mabilis. Halimbawa, kung ihahambing natin ang dalawang bagay o1at o2ilang uri, ang operasyon o1.equals(o2)ay tumatagal ng humigit-kumulang 20 beses na mas maraming oras kaysa o1.hashCode() == o2.hashCode().

Java ay katumbas ng()

Sa parent class Object, kasama ang hashCode() method, mayroon ding equals() , ang function na ginagamit upang suriin ang pagkakapantay-pantay ng dalawang bagay. Ang default na pagpapatupad ng function na ito ay sinusuri lamang ang mga link ng dalawang bagay para sa kanilang pagkakapareho. equals() at hashCode() ang kanilang kontrata, kaya kung i-override mo ang isa sa kanila, dapat mong i-override ang isa, upang hindi masira ang kontratang ito.

Pagpapatupad ng hashCode() na pamamaraan

Halimbawa

Gumawa tayo ng Class Character na may isang field — name . Pagkatapos nito, lumikha kami ng dalawang bagay ng klase ng Character , character1 , at character2 at itinakda ang mga ito sa parehong pangalan. Kung gagamitin natin ang default na hashCode() at equals() ng Object class, tiyak na makakakuha tayo ng iba't ibang bagay, hindi pantay na mga bagay. Ganyan gumagana ang hashcode sa Java. Magkakaroon sila ng iba't ibang mga hashcode dahil nasa iba't ibang memory cell ang mga ito at magiging false ang resulta ng equals() operation.

import java.util.Objects;

public class Character {
    private String Name;

    public Character(String name) {
        Name = name;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    } 

    public static void main(String[] args) {
        Character character1 = new Character("Arnold");
        System.out.println(character1.getName());
        System.out.println(character1.hashCode());
        Character character2 = new Character("Arnold");
        System.out.println(character2.getName());
        System.out.println(character2.hashCode());
        System.out.println(character2.equals(character1));
    }
}
Ang resulta ng pagpapatakbo ng programa:

Arnold
1595428806
Arnold
1072408673
false
Dalawang 10-digit na numero sa console ay mga hashcode. Paano kung gusto nating magkaroon ng pantay na mga bagay kung mayroon silang parehong mga pangalan? Ano ang dapat nating gawin? Ang sagot: dapat nating i-override ang hashCode() at equals() na mga pamamaraan ng Object class para sa aming Character class. Maaari naming gawin ito nang awtomatiko sa IDEA IDE, pindutin lamang ang alt + insert sa iyong keyboard at piliin ang Generate -> equals() at hashCode() . Ano ang Java hashCode() - 2Sa kaso ng aming halimbawa nakuha namin ang susunod na code:

import java.util.Objects;

public class Character {
    private String Name;

    public Character(String name) {
        Name = name;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Character)) return false;

        Character character = (Character) o;

        return getName() != null ? getName().equals(character.getName()) : character.getName() == null;
    }

    @Override
    public int hashCode() {
        return getName() != null ? getName().hashCode() : 0;
    }

    public static void main(String[] args) {
        Character character1 = new Character("Arnold");
        System.out.println(character1.getName());
        System.out.println(character1.hashCode());
        Character character2 = new Character("Arnold");
        System.out.println(character2.getName());
        System.out.println(character2.hashCode());
        System.out.println(character2.equals(character1));
    }
}
Ang resulta ng pagpapatakbo ng code na ito:

Arnold
1969563338
Arnold
1969563338
true
Kaya ngayon ay kinikilala ng programa ang aming mga bagay bilang pantay at mayroon silang parehong mga hashcode.

Halimbawa ng Java hashcode:

Iyong sariling hashCode() at equals()

Maaari ka ring gumawa ng sarili mong equals() at hashCode() realizations, ngunit mag-ingat at tandaan na bawasan ang mga banggaan ng hashcode. Narito ang isang halimbawa ng aming sariling hashCode() at equals() na mga pamamaraan sa klase ng Mag-aaral :

import java.util.Date;

public class Student {
   String surname;
   String name;
   String secondName;
   Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }
//Java hashcode example
   @Override
   public int hashCode(){
       //TODO: check for nulls
       //return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());
       return (surname + name + secondName + birthday).hashCode();
   }
   @Override
   public boolean equals(Object other_) {
       Student other = (Student)other_;
       return (surname == null || surname.equals(other.surname) )
               && (name == null || name.equals(other.name))
               && (secondName == null || secondName.equals(other.secondName))
               && (birthday == null || birthday.equals(other.birthday));
   }
}
At ang Pangunahing klase upang ipakita ang kanilang gawain:

import java.util.Date;
import java.util.HashMap;
import java.util.Hashtable;

public class Main {
   static HashMap<Student, Integer> cache = new HashMap<Student, Integer>(); // <person, targetPriority>

   public static void main(String[] args) {
       Student sarah1 = new Student("Sarah","Connor", "Jane", null);
       Student sarah2 = new Student("Sarah","Connor", "Jane", new Date(1970, 01-1, 01));
       Student sarah3 = new Student("Sarah","Connor", "Jane", new Date(1959, 02-1, 28)); // date not exists
       Student john = new Student("John","Connor", "Kyle", new Date(1985, 02-1, 28)); // date not exists
       Student johnny = new Student("John","Connor", "Kyle", new Date(1985, 02-1, 28)); // date not exists
       System.out.println(john.hashCode());
       System.out.println(johnny.hashCode());
       System.out.println(sarah1.hashCode());
       System.out.println();
       cache.put(sarah1, 1);
       cache.put(sarah2, 2);
       cache.put(sarah3, 3);
       System.out.println(new Date(sarah1.birthday));
       System.out.println();
       cache.put(john, 5);
       System.out.println(cache.get(john));
       System.out.println(cache.get(johnny));
       cache.put(johnny, 7);
       System.out.println(cache.get(john));
       System.out.println(cache.get(johnny));
   }
}

Ano ang gamit ng hashcode?

Una sa lahat, ang mga hashcode ay tumutulong sa mga programa na tumakbo nang mas mabilis. Halimbawa, kung ihahambing natin ang dalawang bagay o1at o2ilang uri, ang operasyon o1.equals(o2)ay tumatagal ng humigit-kumulang 20 beses na mas maraming oras kaysa sa o1.hashCode() == o2.hashCode(). Sa Java hashing prinsipyo nakatayo sa likod ng ilang mga sikat na koleksyon, tulad ng HashMap , HashSet at HashTable .

Konklusyon

Ang bawat Java object ay may hashCode() at equals() na mga pamamaraan na minana mula sa Object class. Upang makakuha ng isang mahusay na mekanismo ng pagkakapantay-pantay sa pagtatrabaho, mas mabuting i-override mo ang hashcode() at equals() na mga pamamaraan para sa sarili mong mga klase. Ang paggamit ng mga hashcode ay nagpapabilis sa pagtakbo ng mga programa.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION