Pelaksanaan String Java menggunakan formula khusus untuk mengira kod cincang:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
di mana s[i] menandakan aksara ke-i rentetan, n mewakili panjangnya, dan ^ menandakan eksponen. Walau bagaimanapun, pertanyaan berkaitan timbul: mengapa pengganda ditetapkan pada 31?
Pilihan ini berpunca daripada prinsip yang digariskan dalam buku terkenal Joshua Bloch, "Effective Java, Second Edition." Rasional Bloch tertumpu pada dua kriteria utama untuk pengganda: ia mestilah nombor perdana yang agak besar.
Faedah Pengganda Perdana Ganjil
Bloch menyerlahkan bahawa menggunakan pengganda perdana ganjil seperti 31 memastikan bahawa operasi pendaraban tidak akan mengakibatkan kehilangan maklumat akibat limpahan. Jika pengganda adalah genap, limpahan mungkin berlaku dan memandangkan pendaraban dengan 2 adalah analog kepada peralihan, maklumat penting boleh terjejas.
Faedah Yang Lebih Halus daripada Pengganda Utama
Walaupun kelebihan khusus memilih pengganda utama kurang jelas, ia sejajar dengan amalan biasa. Terutama, 31 mempunyai atribut unik: ia membolehkan pendaraban digantikan dengan cekap dengan anjakan dan penolakan, yang membawa kepada prestasi yang lebih baik. Pengoptimuman ini selalunya dilaksanakan secara automatik oleh mesin maya moden (VM).
Konsensus
Ringkasnya, penggunaan Java 31 sebagai pengganda untuk kaedah hashCode() String berpunca daripada statusnya sebagai nombor perdana ganjil. Pilihan ini melindungi daripada kehilangan maklumat akibat limpahan dan membolehkan peningkatan prestasi melalui penggantian pendaraban dengan peralihan dan penolakan.
Atas ialah kandungan terperinci Mengapa Java Menggunakan 31 sebagai Pengganda dalam Kod hash () String?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!