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 o1dan o2dari 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.
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() . Dalam kasus contoh kami, kami mendapatkan kode berikutnya:
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 :
importjava.util.Date;publicclassStudent{String surname;String name;String secondName;Long birthday;// Long instead of long is used by Gson/Jackson json parsers and various orm databasespublicStudent(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@OverridepublicinthashCode(){//TODO: check for nulls//return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());return(surname + name + secondName + birthday).hashCode();}@Overridepublicbooleanequals(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:
importjava.util.Date;importjava.util.HashMap;importjava.util.Hashtable;publicclassMain{staticHashMap<Student,Integer> cache =newHashMap<Student,Integer>();// <person, targetPriority>publicstaticvoidmain(String[] args){Student sarah1 =newStudent("Sarah","Connor","Jane",null);Student sarah2 =newStudent("Sarah","Connor","Jane",newDate(1970,01-1,01));Student sarah3 =newStudent("Sarah","Connor","Jane",newDate(1959,02-1,28));// date not existsStudent john =newStudent("John","Connor","Kyle",newDate(1985,02-1,28));// date not existsStudent johnny =newStudent("John","Connor","Kyle",newDate(1985,02-1,28));// date not existsSystem.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(newDate(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 o1dan o2dari 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.