Saya mencoba memikirkan fungsi hash yang baik untuk string. Dan saya berpikir mungkin ide yang baik untuk merangkum nilai unicode untuk lima karakter pertama dalam string (dengan asumsi itu memiliki lima, jika tidak hentikan di mana itu berakhir). Apakah itu ide yang bagus, atau itu ide yang buruk?
Saya melakukan ini di Jawa, tetapi saya tidak akan membayangkan itu akan membuat banyak perbedaan.
String
miliknya sendirihashCode()
?Jawaban:
Biasanya hash tidak akan melakukan penjumlahan, sebaliknya
stop
danpots
akan memiliki hash yang sama.dan Anda tidak akan membatasi ke karakter n pertama karena jika tidak rumah dan rumah akan memiliki hash yang sama.
Umumnya hash mengambil nilai dan mengalikannya dengan bilangan prima (membuatnya lebih mungkin untuk menghasilkan hash unik) Jadi Anda bisa melakukan sesuatu seperti:
sumber
Jika ini masalah keamanan, Anda bisa menggunakan Java crypto:
sumber
Anda mungkin harus menggunakan String.hashCode () .
Jika Anda benar-benar ingin menerapkan kode hash:
Menggunakan hanya lima karakter pertama adalah ide yang buruk . Pikirkan tentang nama hierarkis, seperti URL: mereka semua akan memiliki kode hash yang sama (karena semuanya dimulai dengan "http: //", yang berarti mereka disimpan di bawah ember yang sama di peta hash, menunjukkan kinerja yang buruk.
Berikut adalah kisah perang yang diparafrasekan pada Kode hash dari " Java Efektif ":
sumber
Jika Anda melakukan ini di Jawa maka mengapa Anda melakukannya? Panggil saja
.hashCode()
stringsumber
.hashCode()
. Sebaliknya, gunakan beberapa algoritma yang dikenal.String::hashCode
dispesifikasikan dalam JDK, sehingga sangat portabel seperti halnya keberadaan kelasjava.lang.String
.HashFunction
( Javadoc ) jambu biji menyediakan hashing non-crypto-kuat yang layak.sumber
404
d.Fungsi yang disediakan oleh Nick ini bagus tetapi jika Anda menggunakan String baru (byte [] byte) untuk melakukan transformasi ke String, gagal. Anda dapat menggunakan fungsi ini untuk melakukan itu.
Mungkin ini bisa membantu seseorang
sumber
sumber Logika di balik fungsi hash djb2 - SO
sumber
FNV-1 dikabarkan sebagai fungsi hash yang bagus untuk string.
Untuk string panjang (lebih lama dari, katakanlah, sekitar 200 karakter), Anda bisa mendapatkan kinerja yang baik dari fungsi hash MD4 . Sebagai fungsi kriptografi, itu rusak sekitar 15 tahun yang lalu, tetapi untuk tujuan non kriptografi, masih sangat baik, dan sangat cepat. Dalam konteks Java, Anda harus mengubah nilai 16-bit
char
menjadi kata-kata 32-bit, misalnya dengan mengelompokkan nilai-nilai tersebut menjadi pasangan. Implementasi MD4 yang cepat di Java dapat ditemukan di sphlib . Mungkin berlebihan dalam konteks tugas kelas, tetapi patut dicoba.sumber
Jika Anda ingin melihat implementasi standar industri, saya akan melihat java.security.MessageDigest .
"Intisari pesan adalah fungsi hash satu arah yang aman yang mengambil data berukuran sewenang-wenang dan menghasilkan nilai hash panjang tetap."
sumber
inilah tautan yang menjelaskan banyak fungsi hash yang berbeda, untuk saat ini saya lebih suka fungsi hash ELF untuk masalah khusus Anda. Dibutuhkan sebagai input string yang panjang sewenang-wenang.
sumber
sdbm: algoritma ini dibuat untuk pustaka basis data sdbm (implementasi domain publik dari ndbm)
sumber
sumber
Merupakan ide bagus untuk bekerja dengan angka ganjil ketika mencoba mengembangkan fungsi string yang baik. fungsi ini mengambil string dan mengembalikan nilai indeks, sejauh ini kerjanya cukup baik. dan memiliki sedikit tabrakan. indeks berkisar dari 0 - 300 mungkin bahkan lebih dari itu, tetapi saya belum mendapatkan yang lebih tinggi sejauh ini bahkan dengan kata-kata panjang seperti "teknik elektromekanis"
Hal lain yang dapat Anda lakukan adalah mengalikan setiap karakter int parse dengan indeks karena bertambah seperti kata "beruang" (0 * b) + (1 * e) + (2 * a) + (3 * r) yang akan memberi Anda nilai int untuk bermain. fungsi hash pertama di atas bertabrakan pada "di sini" dan "mendengar" tetapi masih hebat dalam memberikan beberapa nilai unik yang baik. yang di bawah ini tidak bertabrakan dengan "di sini" dan "dengar" karena saya melipatgandakan setiap karakter dengan indeks saat itu meningkat.
sumber
Berikut adalah fungsi hash sederhana yang saya gunakan untuk tabel hash yang saya buat. Pada dasarnya untuk mengambil file teks dan menyimpan setiap kata dalam indeks yang mewakili urutan abjad.
Apa yang pada dasarnya dilakukan adalah kata-kata dipotong menurut huruf pertama mereka. Jadi, kata yang dimulai dengan 'a' akan mendapatkan kunci hash 0, 'b' akan mendapatkan 1 dan seterusnya dan 'z' akan menjadi 25. Angka dan simbol akan memiliki kunci hash 26. Ada keuntungan yang disediakan oleh ini ; Anda dapat menghitung dengan mudah dan cepat di mana kata yang diberikan akan diindeks dalam tabel hash karena semuanya dalam urutan abjad, seperti ini: Kode dapat ditemukan di sini: https://github.com/abhijitcpatil/general
Ini akan menjadi output:
sumber
Ini akan menghindari tabrakan dan itu akan cepat sampai kita menggunakan pergeseran dalam perhitungan.
sumber