Artikel Wikipedia tentang fungsi hash sangat bagus, tetapi saya akan memberikan pendapat saya di sini.
Apa itu hash?
"Hash" adalah istilah yang luas dengan makna formal yang berbeda dalam konteks yang berbeda. Tidak ada jawaban sempurna untuk pertanyaan Anda. Saya akan menjelaskan konsep dasar yang mendasarinya dan menyebutkan beberapa penggunaan istilah yang paling umum.
"Hash" adalah fungsi disebut sebagai fungsi hash
yang mengambil sebagai objek input dan output string atau angka. Objek input biasanya anggota tipe data dasar seperti string, integer, atau yang lebih besar yang terdiri dari objek lain seperti struktur yang ditentukan pengguna. Outputnya biasanya berupa angka atau string. Kata benda "hash" sering merujuk pada hasil ini. Kata kerja "hash" sering berarti "menerapkan fungsi hash". Properti utama yang harus dimiliki oleh fungsi hash adalah:h
- Seharusnya mudah untuk menghitung dan
- Outputnya harus relatif kecil.
Contoh:
Katakanlah kita ingin nomor hash dalam kisaran dari 0 hingga 999.999.999 ke angka antara 0 dan 99. Satu fungsi hash sederhana dapat .h ( x ) = xmod100
Properti tambahan umum:
Bergantung pada use case kami mungkin ingin fungsi hash memenuhi properti tambahan. Berikut adalah beberapa properti tambahan yang umum:
Keseragaman : Seringkali kita ingin hash objek menjadi berbeda. Selain itu kita mungkin ingin hash menjadi "menyebar". Jika saya ingin hash beberapa objek turun menjadi 100 ember (jadi output dari fungsi hash saya adalah angka dari 0-99), maka saya biasanya berharap sekitar 1/100 objek mendarat di bucket 0, sekitar 1/100 mendarat di ember 1, dan seterusnya.
Resistensi tabrakan kriptografi : Kadang-kadang ini diambil lebih jauh, misalnya, dalam kriptografi saya mungkin ingin fungsi hash sedemikian rupa sehingga sulit bagi musuh untuk menemukan dua input berbeda yang memetakan ke output yang sama.
Kompresi : Saya sering ingin memotong input besar secara sewenang-wenang menjadi output ukuran konstan atau jumlah bucket tetap.
Determinisme : Saya mungkin menginginkan fungsi hash yang outputnya tidak berubah di antara run, yaitu output dari fungsi hash pada objek yang sama akan selalu tetap sama. Ini mungkin tampak bertentangan dengan keseragaman di atas, tetapi satu solusi adalah memilih fungsi hash secara acak satu kali, dan tidak mengubahnya antara menjalankan.
Beberapa aplikasi
Salah satu aplikasi umum adalah dalam struktur data seperti tabel hash, yang merupakan cara untuk mengimplementasikan kamus. Di sini, Anda mengalokasikan sebagian memori, katakanlah, 100 "ember"; kemudian, ketika diminta untuk menyimpan pasangan (kunci, nilai) dalam kamus, Anda mengaitkan kunci tersebut ke angka 0-99, dan menyimpan pasangan tersebut dalam ember yang sesuai dalam memori. Kemudian, ketika Anda diminta untuk mencari kunci, Anda hash kunci ke nomor 0-99 dengan fungsi hash yang sama dan periksa ember itu untuk melihat apakah kunci itu ada di sana. Jika demikian, Anda mengembalikan nilainya.
Perhatikan bahwa Anda juga bisa mengimplementasikan kamus dengan cara lain, seperti dengan pohon pencarian biner (jika objek Anda sebanding).
Aplikasi praktis lain adalah checksum, yang merupakan cara untuk memeriksa bahwa dua file adalah sama (misalnya, file tersebut tidak rusak dari versi sebelumnya). Karena fungsi hash sangat tidak mungkin untuk memetakan dua input ke output yang sama, Anda menghitung dan menyimpan hash dari file pertama, biasanya direpresentasikan sebagai string. Hash ini sangat kecil, mungkin hanya beberapa lusin karakter ASCII. Kemudian, ketika Anda mendapatkan file kedua, Anda hash itu dan periksa apakah hasilnya sama. Jika demikian, hampir pasti itu adalah file byte-untuk-byte yang sama persis.
Aplikasi lain adalah dalam kriptografi, di mana hash ini harus sulit untuk "dibalik" - yaitu, mengingat output dan fungsi hash, harus sulit secara komputasi untuk mengetahui input yang mengarah ke output tersebut. Salah satu penggunaannya adalah untuk kata sandi: Alih-alih menyimpan kata sandi itu sendiri, Anda menyimpan hash kriptografi kata sandi (mungkin dengan beberapa bahan lain). Kemudian, ketika pengguna memasukkan kata sandi, Anda menghitung hash-nya dan memeriksa apakah itu cocok dengan hash yang benar; jika demikian, Anda mengatakan kata sandi itu benar. (Sekarang bahkan seseorang yang dapat melihat dan mencari tahu hash yang disimpan di server tidak memiliki waktu yang mudah berpura-pura menjadi pengguna.) Aplikasi ini dapat menjadi kasus di mana output sama panjang atau lebih lama dari input, karena inputnya sangat pendek.