CodeGym /Java Blog /Acak /kode hash Java()
John Squirrels
Level 41
San Francisco

kode hash Java()

Dipublikasikan di grup Acak

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 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.

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() - 2Dalam 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 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.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION