Prinsip Hash
Pertama-tama, sebelum kita mendefinisikan kode hash Java, kita perlu memahami apa itu hashing dan untuk apa. Hashing adalah proses menerapkan fungsi hash ke beberapa data. Fungsi hash hanyalah fungsi matematika. Jangan khawatir tentang ini! "Matematika" tidak selalu berarti "rumit". Di sini maksudnya hanya kita memiliki beberapa data dan aturan tertentu yang memetakan data tersebut ke dalam sekumpulan karakter (kode). Misalnya, itu bisa berupa sandi heksadesimal. Kami memiliki beberapa data dengan ukuran berapa pun pada input, dan menerapkan fungsi hash padanya. Pada output, kami mendapatkan data berukuran tetap, katakanlah, 32 karakter. Biasanya, fungsi semacam itu mengubah sebagian besar data menjadi nilai integer kecil. Hasil kerja fungsi ini disebut kode hash. Fungsi hash banyak digunakan dalam kriptografi, dan beberapa area lainnya juga. Fungsi hash bisa berbeda,
- Objek tertentu memiliki kode hash tertentu.
- Jika dua objek sama, kode hashnya sama. Kebalikannya tidak benar.
- Jika kode hash berbeda, maka objek pasti tidak sama.
- Objek yang berbeda mungkin memiliki kode hash yang sama. Namun, itu adalah peristiwa yang sangat tidak mungkin. Pada titik ini, kami mengalami tabrakan, situasi di mana kami dapat kehilangan data.
Fungsi hash yang "tepat" meminimalkan kemungkinan tabrakan.
Kode hash di Jawa
Di Java fungsi hash biasanya terhubung dengan
metode hashCode() . Tepatnya, hasil penerapan fungsi hash ke Object adalah kode hash. Setiap objek Java memiliki kode hash. Secara umum Kode Hash adalah angka yang dihitung dengan metode
hashCode() kelas
Object
. Biasanya, pemrogram mengganti metode ini untuk objek mereka serta terkait dengan
hashCode() metode
equals() untuk pemrosesan data spesifik yang lebih efisien. Metode hashCode
() mengembalikan nilai int (4 byte), yang merupakan representasi numerik dari objek. Kode hash ini digunakan, misalnya, oleh koleksi untuk penyimpanan data yang lebih efisien dan, karenanya, akses yang lebih cepat ke sana. Secara default,
kode hash()fungsi untuk objek mengembalikan nomor sel memori tempat objek disimpan. Oleh karena itu, jika tidak ada perubahan yang dilakukan pada kode aplikasi, maka fungsi harus mengembalikan nilai yang sama. Jika kode sedikit berubah, nilai kode hash juga berubah. Untuk apa kode hash digunakan di Jawa? Pertama-tama kode hash Java membantu program berjalan lebih cepat. Misalnya, jika kita membandingkan dua objek
o1
dan
o2
dari beberapa jenis, operasi
o1.equals(o2)
memakan waktu sekitar 20 kali lebih lama daripada
o1.hashCode() == o2.hashCode()
.
Java sama dengan()
Di kelas induk
Object
, bersama dengan metode
hashCode() , ada juga
equals() , fungsi yang digunakan untuk memeriksa kesetaraan dua objek. Implementasi default dari fungsi ini hanya memeriksa tautan dari dua objek untuk kesetaraannya.
equals() dan
hashCode() memiliki kontraknya sendiri, jadi jika Anda mengganti salah satunya, Anda harus mengganti yang lain, agar tidak merusak kontrak ini.
Menerapkan metode hashCode()
Contoh
Mari buat kelas
Character dengan satu field —
name . Setelah itu, kita membuat dua objek kelas
Character ,
character1 , dan
character2 dan mengaturnya dengan nama yang sama.
Jika kita menggunakan hashCode() dan
equals() default dari kelas
Object , kita pasti akan mendapatkan objek yang berbeda, bukan objek yang sama. Begitulah cara kerja kode hash di Java. Mereka akan memiliki kode hash yang berbeda karena berada di sel memori yang berbeda dan hasil operasi
equals() akan salah.
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));
}
}
Hasil menjalankan program:
Arnold
1595428806
Arnold
1072408673
false
Dua angka 10 digit di konsol adalah kode hash. Bagaimana jika kita ingin memiliki objek yang sama jika memiliki nama yang sama? Apa yang harus kita lakukan? Jawabannya: kita harus mengganti metode
hashCode() dan
equals() dari kelas Object untuk kelas
Karakter kita . Kita bisa melakukannya secara otomatis di IDEA IDE, cukup tekan
alt + insert pada keyboard Anda dan pilih
Generate -> equals() dan hashCode() .
![Apa itu kode hash Java() - 2]()
Dalam kasus contoh kami, kami mendapatkan kode berikutnya:
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));
}
}
Hasil menjalankan kode ini:
Arnold
1969563338
Arnold
1969563338
true
Jadi sekarang program mengidentifikasi objek kita sama dan mereka memiliki kode hash yang sama.
Contoh kode hash Java:
Kode hash Anda sendiri () dan sama dengan ()
Anda juga dapat membuat realisasi equals() dan
hashCode() Anda sendiri , tetapi hati-hati dan ingat untuk meminimalkan tabrakan kode hash. Berikut adalah contoh metode
hashCode() dan
equals() kita sendiri di kelas
Student :
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));
}
}
Dan kelas
Utama untuk mendemonstrasikan pekerjaan mereka:
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));
}
}
Untuk apa kode hash digunakan?
Pertama-tama kode hash membantu program berjalan lebih cepat. Misalnya, jika kita membandingkan dua objek
o1
dan
o2
dari beberapa jenis, operasi
o1.equals(o2)
membutuhkan waktu sekitar 20 kali lebih banyak daripada o1.hashCode() == o2.hashCode(). Dalam prinsip hashing Java berdiri di belakang beberapa koleksi populer, seperti
HashMap ,
HashSet dan
HashTable .
Kesimpulan
Setiap objek Java memiliki
metode hashCode() dan
equals() yang diwarisi dari kelas
Object . Untuk mendapatkan mekanisme kesetaraan kerja yang baik, Anda sebaiknya mengganti metode
hashcode() dan
equals() untuk kelas Anda sendiri. Menggunakan kode hash membuat program berjalan lebih cepat.
GO TO FULL VERSION