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
Object
klase. 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
o1
at
o2
ilang 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() - 2]()
Sa 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
o1
at
o2
ilang 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.
GO TO FULL VERSION