Di Java, algoritma hashcode dapat digunakan untuk menghitung nilai hash dari suatu string. Hari ini, seorang teman tiba -tiba bertanya kepada saya apakah saya dapat menghitung kode hash di JS, dan persyaratannya sama dengan hasil perhitungan kode hashcode dari Java.
Saya tidak pernah memahami algoritma kode hash Java sampai sekarang, tetapi mungkin tidak akan terlalu sulit. Jadi saya menulis kode ini di Java untuk pengujian:
Hasil Menjalankan: 899755
Tekan tombol CTRL dan klik nama metode HashCode untuk menindaklanjuti dan melihat algoritma. Saya menemukan bahwa itu adalah beberapa kalimat kode sederhana, seperti yang ditunjukkan di bawah ini:
Salinan kode adalah sebagai berikut:
hashcode int publik () {
int h = hash;
if (h == 0) {
int off = offset;
char val [] = nilai;
int len = hitung;
untuk (int i = 0; i <len; i ++) {
h = 31*h+val [OFF ++];
}
hash = h;
}
kembali h;
}
Sekarang, seharusnya baik -baik saja jika Anda hanya porsinya ke JS. Jadi saya menulis kode JS berikut:
Salinan kode adalah sebagai berikut:
<type skrip = "Teks/JavaScript">
fungsi hashcode (str) {
var h = 0, off = 0;
var len = str.length;
untuk (var i = 0; i <len; i ++) {
h = 31 * h+str.charcodeat (off ++);
}
kembali h;
}
alert (hashcode ('shenyang'));
</script>
Hasil Menjalankan: 899755
OK, sama seperti hasil perhitungan Java. Saya pikir ini akan dilakukan, dan kemudian saya berpikir untuk menemukan string untuk mengujinya:
"Shenyang, Shenyang", hasil berlari di Jawa adalah: 1062711668, tetapi menjadi: 26832515444 di JS.
Saya sangat buruk, ada masalah dengan ini hanya satu percobaan! Setelah berpikir sejenak, saya tiba -tiba menyadari bahwa panjang int di Jawa tampaknya sekitar 2,1 miliar, dan tidak ada batasan seperti itu di JS. Masalahnya harus ada di sini, jadi saya membuat beberapa modifikasi pada metode sebelumnya:
Salinan kode adalah sebagai berikut:
<script>
fungsi hashcode (str) {
var h = 0, off = 0;
var len = str.length;
untuk (var i = 0; i <len; i ++) {
h = 31 * h+str.charcodeat (off ++);
}
var t = -2147483648*2;
while (h> 2147483647) {
h+= t
}
kembali h;
}
waspada (hashcode ('shenyang shenyang')); </script>
Uji lagi! OKE! Misi selesai. Tidak ada konten teknis, sedikit ringkasan
Diperbarui pada 2013-02-19, yang di atas relatif tidak efisien dan akan dihilangkan ketika kontennya sangat panjang. Kode berikut adalah kode yang dioptimalkan:
Salinan kode adalah sebagai berikut:
<script>
fungsi hashcode (str) {
var h = 0;
var len = str.length;
var t = 2147483648;
untuk (var i = 0; i <len; i ++) {
h = 31 * h + str.charcodeat (i);
if (h> 2147483647) h %= t; // java int overflows untuk mengambil modul
}
/ * var t = -2147483648 * 2;
while (h> 2147483647) {
h += t
}*/
kembali h;
}
alert (hashCode ('C# cara mengeksekusi n utas secara bersamaan pada saat yang sama, sisanya diimplementasikan dalam antrian')); // 1107373715
</script>