Untuk apa kode hash digunakan? Apakah ini unik?

129

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?

Nghia Nguyen
sumber
Saya tahu apa artinya kode hash, saya mencoba menjalankan kode saya berkali-kali untuk mendapatkan kode hash dan mengembalikan kode hash yang sama untuk item yang sama setiap kali dan sepertinya tidak akan diduplikasi, tetapi saya tidak begitu yakin. Baiklah, jika Anda ingin downvote, itu pendapat Anda. Terima kasih untuk hasil editnya!
Nghia Nguyen
7
Saya merekomendasikan membaca Pedoman dan aturan Eric Lippert untuk GetHashCode , meskipun ini berfokus pada aturan untuk mengimplementasikan HashCodes daripada aturan untuk menggunakannya ... karena mereka " dengan desain berguna hanya untuk satu hal: meletakkan objek di tabel hash"
Brian

Jawaban:

108

MSDN mengatakan :

Kode hash adalah nilai numerik yang digunakan untuk mengidentifikasi objek selama pengujian kesetaraan. Itu juga bisa berfungsi sebagai indeks untuk objek dalam koleksi.

Metode GetHashCode cocok untuk digunakan dalam algoritma hashing dan struktur data seperti tabel hash.

Implementasi default metode GetHashCode tidak menjamin nilai pengembalian yang unik untuk objek yang berbeda. Selain itu, .NET Framework tidak menjamin implementasi default metode GetHashCode, dan nilai yang dikembalikannya akan sama antara versi berbeda dari .NET Framework. Akibatnya, implementasi default metode ini tidak boleh digunakan sebagai pengidentifikasi objek unik untuk tujuan hashing.

Metode GetHashCode dapat diganti oleh tipe turunan. Tipe nilai harus menimpa metode ini untuk menyediakan fungsi hash yang sesuai untuk tipe itu dan untuk menyediakan distribusi yang berguna dalam tabel hash. Untuk keunikan, kode hash harus didasarkan pada nilai bidang contoh atau properti alih-alih bidang statis atau properti.

Objek yang digunakan sebagai kunci dalam objek Hashtable juga harus mengganti metode GetHashCode karena objek tersebut harus menghasilkan kode hash mereka sendiri. Jika objek yang digunakan sebagai kunci tidak menyediakan implementasi GetHashCode yang berguna, Anda bisa menentukan penyedia kode hash saat objek Hashtable dibangun. Sebelum .NET Framework versi 2.0, penyedia kode hash didasarkan pada antarmuka System.Collections.IHashCodeProvider. Dimulai dengan versi 2.0, penyedia kode hash didasarkan pada antarmuka System.Collections.IEqualityComparer.

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).

Slaks
sumber
3
Kutipan dari MSDN sekarang kedaluwarsa. MSDN sekarang tidak eksplisit tentang kode hash yang tidak unik.
user34660
248

Setelah mempelajari apa itu semua, saya berpikir untuk menulis penjelasan semoga lebih sederhana melalui analogi:

Rangkuman: Apa itu kode hash?

  • Ini sidik jari. Kita dapat menggunakan sidik jari ini untuk mengidentifikasi orang-orang yang menarik.

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 :

  • Sangat sulit bagi dua orang untuk memiliki sidik jari yang sama (bukan tidak mungkin, tetapi sangat tidak mungkin).
  • Sidik jari Tn. Cruel tidak akan pernah berubah.
  • Setiap bagian dari seluruh keberadaan Mr Cruel: penampilan, warna rambut, kepribadian, kebiasaan makan, dll. Harus (idealnya) tercermin dalam sidik jarinya, sehingga jika ia memiliki saudara lelaki (yang sangat mirip tetapi tidak sama) - maka keduanya harus memiliki sidik jari yang berbeda . Saya katakan "harus" karena kami tidak dapat menjamin 100% bahwa dua orang di dunia ini akan memiliki sidik jari yang berbeda.
  • Tetapi kami selalu dapat menjamin bahwa Tuan Cruel akan selalu memiliki sidik jari yang sama - dan sidik jarinya tidak akan pernah berubah.

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.

Sidik Jari Digital - Atribut gambar ke Pixabay - Gratis tersedia untuk digunakan di: https://pixabay.com/en/finger-fingerprint-security-digital-2081169/

  1. Dua orang / objek yang berbeda secara teoritis masih dapat memiliki sidik jari yang sama. Atau dengan kata lain. Jika Anda memiliki dua sidik jari yang sama ......... maka keduanya tidak perlu berasal dari orang / objek yang sama.
  2. Buuuuuut, orang / objek yang sama akan selalu mengembalikan sidik jari yang sama .
  3. Yang berarti bahwa jika dua objek mengembalikan kode hash yang berbeda maka Anda tahu 100% kepastian bahwa objek tersebut berbeda.

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!

BKSpurgeon
sumber
1
Re: Dokumentasi MSDN membunuh beberapa sel otak saya .... mendorong beberapa sel saya ke ujung bunuh diri. diselamatkan hanya karena saya tertidur;)
Shwrk
Anda menghancurkan seluruh penjelasan bagus Anda dengan komentar asterisk di akhir.
Waldemar Gałęzinowski
Aku menyukainya! terutama nama "Mr.Cruel!
João Pedro Andrade Marques
Sebagai penggemar kriminal sejati, ini sangat mungkin jawaban SO saya yang paling favorit ... pernah.
IfElseTryCatch
11

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".

melihat
sumber
8

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

Phil Sandler
sumber
4

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.

Shree Harsha
sumber