Konten utama artikel ini adalah metode evaluasi yang benar dari kode hash di Java, sebagai berikut.
Ada optimasi untuk daftar hash yang dapat menyimpan kode hash objek. Jika kode hash tidak cocok, itu tidak akan memeriksa kesetaraan objek dan secara langsung menganggapnya sebagai objek yang berbeda. Jika kode hash (kode hash) sama, itu akan mendeteksi apakah objeknya sama.
Jika objek memiliki kode hash yang sama (kode hashcode), mereka dipetakan ke ember hash yang sama. Jika kode hash dari semua objek dalam daftar hashlist adalah sama, daftar hashlist akan merosot menjadi daftar yang terhubung, yang sangat mengurangi efisiensi kueri.
Fungsi hash yang baik biasanya cenderung "menghasilkan kode hash yang tidak setara untuk objek yang tidak ingin menunggu". Idealnya, fungsi hash harus mendistribusikan instance secara merata di set yang tidak ingin menjadi semua hash yang mungkin, tetapi sangat sulit untuk sepenuhnya mencapai situasi ideal ini. Berikut adalah metode hashing yang relatif sederhana dan efektif:
1. Simpan nilai konstan yang tidak nol, seperti 17, dalam variabel tipe int yang disebut hasil.
2. Untuk setiap domain kunci F dalam objek ( mengacu pada setiap domain yang terlibat dalam metode Equals ), selesaikan langkah -langkah berikut:
result = 31 * result + c; Operasi multiplikasi adalah untuk mendapatkan fungsi hash yang lebih baik. Misalnya, jika fungsi hash dari string menghilangkan perkalian, maka semua string dengan urutan alfabet yang berbeda akan memiliki kode hash yang sama. Alasan mengapa 31 dipilih di sini adalah karena itu adalah bilangan prima yang aneh. Jika pengganda adalah angka genap dan perkalian meluap, informasi akan hilang karena mengalikan dengan 2 setara dengan perpindahan. Manfaat menggunakan bilangan prima tidak jelas, tetapi hasil hash secara konvensional digunakan untuk menghitung hasil hash. 31 memiliki fitur yang baik, yaitu, menggunakan shift dan pengurangan alih -alih perkalian, yang dapat mencapai kinerja yang lebih baik: 31 * i == (i << 5) - i. VM saat ini dapat secara otomatis mengimplementasikan optimasi ini.Jika suatu kelas tidak dapat diubah (semua domain adalah modifikasi akhir, dan semua domain adalah tipe dasar atau kelas yang tidak dapat diubah), dan overhead menghitung kode hash juga relatif tinggi, maka Anda harus mempertimbangkan cache kode hash di dalam objek.
kelas publik hashcodedemo {kelas statis hashcodeclass {private final boolean bresult; Bytevalue byte final final pribadi; Private Final Char Charvalue; Sorportvalue Pendek Terakhir Pribadi; Intvalue int final pribadi; final longvalue long final pribadi; float float float private; Doublevalue ganda akhir pribadi; string final final pribadi str; final final int [] arrayValue; // Volatile berarti bahwa variabel disimpan dan diambil dalam memori setiap kali untuk memastikan bahwa variabel adalah kode hashcode int volatil swasta terbaru; publik hashcodeclass () {bresult = false; bytevalue = 1; charvalue = 'a'; ShortValue = 1; intvalue = 1; LongValue = 1L; floatValue = 1.0f; DoubleValue = 1.0D; str = getClass (). getName (); arrayValue = int int [] {1,2,3,4,5}; } @Override public int hashCode () {if (hashCode == 0) {// Tetapkan nilai awal yang tidak nol untuk meningkatkan konflik hasil int domain nol = 17; // Jika pengganda dihilangkan, maka semua string dengan urutan alfabet yang berbeda akan memiliki kode hash yang sama final int hash_code = 31; hasil = hash_code * hasil + (Bresult? 1: 0); hasil = hash_code * hasil + bytevalue; hasil = hash_code * hasil + charvalue; result = hash_code * hasil + shortValue; hasil = hash_code * hasil + intvalue; hasil = hash_code * hasil + (int) (longValue ^ (longValue >>> 32)); hasil = hash_code * hasil + float.floattointbits (floatValue); long doublelongValue = double.doubletoloongbits (doublevalue); result = hash_code * hasil + (int) (doublelongValue ^ (doublelongValue >>> 32)); hasil = hash_code * hasil + (str == null? 0: str.hashcode ()); System.out.println ("str =" + str + ", str.HashCode =" + str.HashCode ()); hasil = hash_code * hasil + arrayValue.hashcode (); hasil pengembalian; } return hashCode; }} public static void main (string [] args) {hashCodeclass obj = new HashCodeclass (); System.out.println ("obj.hashcode =" + obj.hashcode ()); System.out.println ("obj ="+obj.tostring ()); }}Keluaran
str = com.demo.test.hashcodedemo $ hashcodeclass, str.hashcode = -205823051obj.hashcode = 946611167str = com.demo.test.hashcodedemo $ hashcodeclass, str.hashcode=-205823051obj=com.demo.test.hashcodedemo$hashcodeclass@386c23df
Meringkaskan
Di atas adalah semua tentang artikel ini yang membahas metode evaluasi kode hash yang benar di Java, dan saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!