Fungsi hash digunakan untuk membuat rangkuman (summary) dari rentetan data (pesan). Rangkuman ini bisa hanya berupa sebuah bit (biasanya disebut parity check) sampai rentetan bit (misalnya MD5, yang panjangnya 128 bit).
Fungsi hash dikategorikan sebagai fungsi satu arah karena diberikan keluaran sebuah fungsi hash kita tidak bisa menemukan data atau pesan aslinya. Jika Anda saya berikan rangkuman satu bit, “1″, apa pesan aslinya?
Ada banyak implementasi fungsi hash. Iseng-iseng saya buat sebuah fungsi hash sederhana yang pada prinsipnya dia menjumlahkan nilai kode ASCII dari data yang diberikan ke dia.
#! /usr/bin/perl
# fungsi hash sederhana - menambahkan nilai ASCII dari input
# BR - nov 2009
$modulus=65536; # modulus pembagi total
print "Masukkan sebuah pesan sederhana dan tekan return\n";
print "Pesan: ";
$pesan = <STDIN>;
chop($pesan); # hapus carriage return di akhir pesan
print $pesan . " panjang: " . length($pesan) . "\n";
$total=0;
for ($i=0; $i < length($pesan) ; $i++) {
print "$i";
$karakter = substr($pesan,$i,1);
print " $karakter";
$ascii = ord($karakter);
print " $ascii";
$total = $total + $ascii;
$total = $total % $modulus;
print " $total";
print "\n";
}
Berikut ini contoh keluarannya.
macbook$ perl perl-hash-tambah.pl
Masukkan sebuah pesan sederhana dan tekan return
Pesan: BUDI
BUDI panjang: 4
0 B 66 66
1 U 85 151
2 D 68 219
3 I 73 292
Contoh di atas saya memasukkan empat karakter; “B”, “U”, “D”, “I”. Masing-masing dicari nilai ASCII-nya kemudian dijumlahkan. Hasilnya adalah 292.
Pesan: BUDI.
BUDI. panjang: 5
0 B 66 66
1 U 85 151
2 D 68 219
3 I 73 292
4 . 46 338
Kalau kita coba dengan masukan lain, yaitu menambahkan titik (.) di belakangnya, maka hasil hashnya adalah 338. Berbeda kan?
Coba sebutkan kelemahan dari program hash ini.
Link terkait: versi bahasa C ada di sini.
bisa menghasilkan hasil yang sama untuk dua kata yang berbeda??
[...] Simple Hash Function By CG Leave a Comment Categories: coding Tags: hash function A very simple hash function. The perl version is available here. [...]
hasil sama untuk kata yang anagram
ada lagi, kata yang panjangnya beda tapi hasil modulusnya bisa sama
Bud, kalau kita tahu hasilny, bagaimana cara untuk kembali ke pesan aslinya ya…..
Salam, BS
@pak ben, memang pesan aslinya tidak bisa kembali karena fungsi hash hanya untuk menjaga integritas pesan (bahwa tidak ada yang berubah dari pesannya). jadi dia tidak berfungsi untuk menyandikan (encrypt). gitu pak.
IMHO, salah satu kelemahan utamanya:
kalau data pesan “BUDI” itu dikirim melalu suatu jalur transmisi dan menjadi rusak, misalnya dari “BUDI” menjadi “AVCJ” (AVCJ jg akan menghasilkan nilai hash yang sama yaitu 292), sisi penerima mungkin akan beranggapan kalau data yang diterima itu valid karena nilai hash yang jadi parity checknya valid.
fungsi hash yang baik tentu mestinya menghasilkan nilai yang identik/unik untuk setiap inputnya
CMIIW
ini pembahasan yang cukup meriah, banyak perbandingan & rumus: http://www.burtleburtle.net/bob/hash/doobs.html
Ini juga kajian secara visual tentang beberapa hash function: http://www.flickr.com/photos/hgn_rocket_science/tags/hashfunction/
Saya dapat link nya dari http://libhashish.sourceforge.net/
saya masih berkutat dengan array of pointer sama array of char..
Pak Budi, istilah rangkuman rasanya kurang pas. Lebih pas pemetaan atau transformasi…
jika inputnya AD sama dengan input BC:
cadangan-125-40:~ Apple$ perl5.8.8 test.pl
Masukkan sebuah pesan sederhana dan tekan return
Pesan: AD
AD panjang: 2
0 A 65 65
1 D 68 133
cadangan-125-40:~ Apple$ perl5.8.8 test.pl
Masukkan sebuah pesan sederhana dan tekan return
Pesan: BC
BC panjang: 2
0 B 66 66
1 C 67 133
@bu yani, saya menggunakan istilah “rangkuman” sebagai terjemahan dari “digest”. Saya rasa agak mirip juga karena pada prinsipnya dia membuat semacam “rangkuman”.
Pemetaan dan transformasi memang benar, tetapi konotasi (bahwa dia melakukan digesting) tidak muncul.
Waduh..fungsi ’sederhana’ saja nampak rumit bagi saya ^_^
apakah konstanta ‘%modulus’ tersebut memang dibutuhkan Pak? (dan ‘$total = $total % $modulus’)
sepertinya (menurut orang awam seperti saya), baris no.05 dan baris no.21 dihapus pun, hasil dari program tersebut akan tetap sama. Fungsi sebetulnya untuk apa Pak?
maafkan Pak, saya baru belajar ‘per-coding-an’
Terima kasih
modulus itu digunakan untuk membatasi nilai atasnya. Kebetulnya saya memilih 4 bytes, alias 0 sd 65535.
Kalau mau melihat dia “in-action”, coba ganti nilai modulus tersebut dengan “256″. Nanti hasilnya lebih menarik.
Ouw..I see
Terima kasih Pak.
Ternyata nilai ‘hash’ yang dihasilkan akan dibatasi oleh nilai modulus tersebut. Sehingga jika nilai output-nya (ascii) melebihi nilai modulus-nya, maka akan kembali ke-nol (0), atau istilahnya ‘overflow’ ya? (maaf kalo ngaco)
Jika nilai modulus tersebut kita abaikan (baris-5 dan baris-21 tidak ditulis), maka hasil dari nilai ‘hash’-nya tidak akan dibatasi (alias tidak terbatas) ya pak? Namun ketika dicoba, maksimum jumlah input karakter-nya hingga 1023 karakter saja ya?
Hihi..menarik, namun ilmunya (pemahamannya) belum sampai ^_^