Saya perhatikan ada getHashCode()
metode di setiap kontrol, item, di WP7, yang mengembalikan urutan angka. Bisakah saya menggunakan kode hash ini untuk mengidentifikasi item? Misalnya saya ingin mengidentifikasi gambar atau lagu di perangkat, dan memeriksa keberadaannya. Ini dapat dilakukan jika kode hash yang diberikan untuk item tertentu adalah unik.
Bisakah Anda membantu menjelaskan kepada saya untuk apa kode hash dan getHashCode()
digunakan?
Jawaban:
MSDN mengatakan :
Pada dasarnya, kode hash ada untuk membuat hashtables menjadi mungkin.
Dua objek yang sama dijamin memiliki kode hash yang sama.
Dua objek yang tidak sama tidak dijamin memiliki kode hash yang tidak sama (itu disebut tabrakan).
sumber
Setelah mempelajari apa itu semua, saya berpikir untuk menulis penjelasan semoga lebih sederhana melalui analogi:
Rangkuman: Apa itu kode hash?
Baca di bawah untuk detail lebih lanjut:
Pikirkan Hashcode saat kami mencoba Untuk Mengidentifikasi Seseorang secara Unik
Saya seorang detektif, sedang mencari penjahat. Mari kita memanggilnya Tn. Cruel. (Dia adalah seorang pembunuh terkenal ketika saya masih kecil - dia masuk ke sebuah rumah yang diculik dan membunuh seorang gadis miskin, membuang tubuhnya dan dia masih berkeliaran - tapi itu masalah yang terpisah). Tn. Cruel memiliki karakteristik khusus tertentu yang dapat saya gunakan untuk mengidentifikasinya secara unik di antara banyak orang. Kami memiliki 25 juta orang di Australia. Salah satunya adalah Tn. Cruel. Bagaimana kita dapat menemukannya?
Cara buruk Mengidentifikasi Tn. Kejam
Rupanya Tuan Cruel memiliki mata biru. Itu tidak banyak membantu karena hampir separuh populasi di Australia juga memiliki mata biru.
Cara yang baik untuk Mengidentifikasi Tn. Kejam
Apa lagi yang bisa saya gunakan? Saya tahu: Saya akan menggunakan sidik jari!
Keuntungan :
Karakteristik di atas umumnya membuat fungsi hash yang baik.
Jadi apa masalahnya dengan 'Tabrakan'?
Jadi bayangkan jika saya mendapat petunjuk dan saya menemukan seseorang yang cocok dengan sidik jari Pak Cruel. Apakah ini berarti saya telah menemukan Tn. Kejam?
........mungkin! Saya harus melihat lebih dekat. Jika saya menggunakan SHA256 (fungsi hashing) dan saya mencari di kota kecil dengan hanya 5 orang - maka ada peluang yang sangat baik saya menemukannya! Tetapi jika saya menggunakan MD5 (fungsi hashing terkenal lainnya) dan memeriksa sidik jari di kota dengan +2 ^ 1000 orang, maka itu adalah kemungkinan yang cukup baik bahwa dua orang yang sama sekali berbeda mungkin memiliki sidik jari yang sama.
Jadi apa manfaat dari semua ini?
Satu-satunya manfaat nyata dari kode hash adalah jika Anda ingin meletakkan sesuatu di tabel hash - dan dengan tabel hash Anda ingin menemukan objek dengan cepat - dan di situlah kode hash masuk. Mereka memungkinkan Anda untuk menemukan hal-hal dalam tabel hash benar-benar segera. Ini adalah retasan yang secara besar-besaran meningkatkan kinerja, tetapi dengan sedikit akurasi.
Jadi mari kita bayangkan kita memiliki tabel hash yang penuh dengan orang - 25 juta tersangka di Australia. Tuan Cruel ada di suatu tempat di sana ..... Bagaimana kita dapat menemukannya dengan sangat cepat ? Kita perlu memilah-milah semuanya: untuk menemukan pasangan potensial, atau untuk membebaskan tersangka potensial. Anda tidak ingin mempertimbangkan karakteristik unik setiap orang karena itu akan memakan terlalu banyak waktu. Apa yang akan Anda gunakan? Anda akan menggunakan kode hash! Kode hash dapat memberi tahu Anda jika dua orang berbeda. Apakah Joe Bloggs BUKAN Tuan Kejam. Jika cetakan tidak cocok maka Anda tahu pasti BUKAN Tn. Cruel. Tapi, jika sidik jari cocokkemudian tergantung pada fungsi hash yang Anda gunakan, kemungkinan Anda sudah cukup baik menemukan pria Anda. Tapi ini tidak 100%. Satu-satunya cara Anda dapat memastikan adalah untuk menyelidiki lebih lanjut: (i) apakah dia memiliki kesempatan / motif, (ii) saksi dll.
Ketika Anda menggunakan komputer jika dua objek memiliki nilai kode hash yang sama, maka Anda perlu menyelidiki lebih lanjut apakah keduanya benar-benar sama. mis. Anda harus memeriksa apakah objek memiliki tinggi yang sama, berat yang sama, dll., jika bilangan bulatnya sama, atau apakah customer_id cocok, dan kemudian sampai pada kesimpulan apakah benda-benda itu sama. ini biasanya dilakukan mungkin dengan mengimplementasikan antarmuka IComparer atau IEquality.
Ringkasan Kunci
Jadi pada dasarnya kode hash adalah sidik jari.
Dibutuhkan 3 menit yang baik untuk mendapatkan kepala Anda di atas. Mungkin membacanya beberapa kali sampai masuk akal. Saya harap ini membantu seseorang karena butuh banyak kesedihan bagi saya untuk mempelajari semuanya!
sumber
GetHashCode()
digunakan untuk membantu mendukung menggunakan objek sebagai kunci untuk tabel hash. (Hal serupa ada di Jawa dll). Tujuannya adalah agar setiap objek mengembalikan kode hash yang berbeda, tetapi ini sering kali tidak dapat dijamin sepenuhnya. Hal ini diperlukan meskipun dua objek secara logis sama mengembalikan sama kode hash.Implementasi tabel hash yang khas dimulai dengan nilai kode hash, mengambil modulus (dengan demikian membatasi nilai dalam rentang) dan menggunakannya sebagai indeks ke array "ember".
sumber
Ini tidak unik untuk WP7 - hadir di semua objek .Net. Ini semacam melakukan apa yang Anda gambarkan, tetapi saya tidak akan merekomendasikan itu sebagai pengidentifikasi unik di aplikasi Anda, karena tidak dijamin unik.
Metode Object.GetHashCode
sumber
Ini dari artikel msdn di sini:
https://blogs.msdn.microsoft.com/tomarcher/2006/05/10/are-hash-codes-unique/
"Meskipun Anda akan mendengar orang menyatakan bahwa kode hash menghasilkan nilai unik untuk input yang diberikan, kenyataannya adalah bahwa, meskipun sulit untuk dicapai, secara teknis layak untuk menemukan dua input data berbeda yang hash dengan nilai yang sama . Namun, yang benar faktor penentu mengenai efektivitas algoritma hash terletak pada panjang kode hash yang dihasilkan dan kompleksitas data yang hash. "
Jadi gunakan saja algoritma hash yang cocok dengan ukuran data Anda dan itu akan memiliki kode hash yang unik.
sumber