20
HASHING Pada metode-metode pencarian yang telah kita pelajari, secara umum banyaknya pembandingan untuk mencari data atau rekaman yang diinginkan tergantung dari banyaknya data atau rekaman yang diketahui. Jika setiap data atau rekaman bisa ditemukan dengan sekali pemasupan terhadap tabel yang digunakan untuk menyimpan data atau rekaman tersebut, maka lokasi data atau rekaman dalam tabel hanya tergantung dari kunci yang digunakan dan tidak tergantung dari kunci yang lain, seperti dalam pohon. Cara yang paling efisien untuk mengorganisir tabel ini adalah dengan menggunakan larik. Jika kunci berupa integer, kunci tersebut sekaligus bisa digunakan sebagai subskrip dari larik yang dimaksud. Dengan mengacu pada penjelasan diatas, perhatikan conoth berikut. Sebagai contoh, suatu toko buku menjual 100 judul buku dan setiap buku mempunyai makssimum dua digit pengenal. Cara yang paling sederhana untuk menyimpan data di atas adalah typedef char *NomorBuku[100]; Buku = NomorBuku; Dimana Buku[i] menunjukkan buku yang mempunyai pengenal (nomor buku) i. Dalam contoh ini nomor buku dimanfaatkan sebagai subskrib larik Buku. Dalam perkembangannya, toko buku tersebut berkembang dan menjual lebih dari 100 judul buku dan buku-buku tersebut dikelompokkan sedemikian rupa sehinggga masing-masing buku sekarang memerlukan kode dengan buah digit. Dengan menggunakan larik seperti contoh diatas, pemilik toko buku harus menyediakan larik dengan 10 juta elemen untuk menyimpan data buku yang ada. Hal ini tentu saja tidak praktis, sehingga diperlukan cara yang lebih efisien untuk mengatasi hal ini. Cara yang dimaksud pada dasarnya adalah untuk mengkonversikan kode buku (yang memerlukan 7 digit) menjadi integer dalam batas tertentu. Secara ideal, masing-masing kode buku harus dikonversikan menjadi suatu integer yang berbeda, tetapi hal ini seringkali sukar untuk dilaksanakan. Dengan menggunakan contoh diatas, toko buku tersebut mempunyai kurang dari 1000 judul buku, dan tetap menggunakan kode yang kurang dari 7 buah digit. Dengan demikian, pemilik toko buku tersebut cukup menyediakan larik dengan 1000 buah elemen yang nomor subskribnya 0...999, dan memanfaatkan 3 digit terakhir dari kode buku untuk menempatkan semua kode buku pada larik yang diketahui. Gambar 1 mengilustrasikan contoh ini. Dari gambar tersebut dapat dilihat, bahwa jarak dua buah kode buku hanya ditentukan oleh 3 digit terakhir, sehingga dua buku dengan kode 1002372 dan 1002772 akan mempunyai jarak yang lebih besar dibandingkan dua buku yang mempunyai kode 0001996 dan 5192998.

Buku Diktat - Fungsi Hashing

Embed Size (px)

DESCRIPTION

Project Buku Diktat ALPRO3 - HASHING (Semester 3)iSTTS Surabaya

Citation preview

Page 1: Buku Diktat - Fungsi Hashing

HASHING

Pada metode-metode pencarian yang telah kita pelajari, secara umum banyaknya pembandingan untuk mencari data atau rekaman yang diinginkan tergantung dari banyaknya data atau rekaman yang diketahui. Jika setiap data atau rekaman bisa ditemukan dengan sekali pemasupan terhadap tabel yang digunakan untuk menyimpan data atau rekaman tersebut, maka lokasi data atau rekaman dalam tabel hanya tergantung dari kunci yang digunakan dan tidak tergantung dari kunci yang lain, seperti dalam pohon. Cara yang paling efisien untuk mengorganisir tabel ini adalah dengan menggunakan larik. Jika kunci berupa integer, kunci tersebut sekaligus bisa digunakan sebagai subskrip dari larik yang dimaksud.

Dengan mengacu pada penjelasan diatas, perhatikan conoth berikut. Sebagai contoh, suatu toko buku menjual 100 judul buku dan setiap buku mempunyai makssimum dua digit pengenal. Cara yang paling sederhana untuk menyimpan data di atas adalah

typedef char *NomorBuku[100];Buku = NomorBuku;

Dimana Buku[i] menunjukkan buku yang mempunyai pengenal (nomor buku) i. Dalam contoh ini nomor buku dimanfaatkan sebagai subskrib larik Buku.

Dalam perkembangannya, toko buku tersebut berkembang dan menjual lebih dari 100 judul buku dan buku-buku tersebut dikelompokkan sedemikian rupa sehinggga masing-masing buku sekarang memerlukan kode dengan buah digit. Dengan menggunakan larik seperti contoh diatas, pemilik toko buku harus menyediakan larik dengan 10 juta elemen untuk menyimpan data buku yang ada. Hal ini tentu saja tidak praktis, sehingga diperlukan cara yang lebih efisien untuk mengatasi hal ini. Cara yang dimaksud pada dasarnya adalah untuk mengkonversikan kode buku (yang memerlukan 7 digit) menjadi integer dalam batas tertentu. Secara ideal, masing-masing kode buku harus dikonversikan menjadi suatu integer yang berbeda, tetapi hal ini seringkali sukar untuk dilaksanakan.

Dengan menggunakan contoh diatas, toko buku tersebut mempunyai kurang dari 1000 judul buku, dan tetap menggunakan kode yang kurang dari 7 buah digit. Dengan demikian, pemilik toko buku tersebut cukup menyediakan larik dengan 1000 buah elemen yang nomor subskribnya 0...999, dan memanfaatkan 3 digit terakhir dari kode buku untuk menempatkan semua kode buku pada larik yang diketahui. Gambar 1 mengilustrasikan contoh ini. Dari gambar tersebut dapat dilihat, bahwa jarak dua buah kode buku hanya ditentukan oleh 3 digit terakhir, sehingga dua buku dengan kode 1002372 dan 1002772 akan mempunyai jarak yang lebih besar dibandingkan dua buku yang mempunyai kode 0001996 dan 5192998.

Dengan melihat pada contoh diatas, kita bisa memperhatikan bahwa pemilik toko buku tersebut memerlukan suatu fungsi untuk mengkonversikan kode buku ke nomor posisi dari larik yang diketahui. Fungsi ini disebut dengan fungsi hash. Metode pencarian yang memanfaatkan fungsi hash disebut hashing atau hash addressing. Tujuan utama dalam penentuan fungsi hash adalah agar dua buah kunci yang berbeda tidak mempunyai nilai hash yang sama. Jika hal ini terjadi, akan menyebabkan terjadinya tabrakan (hash collision / hash clash).

Page 2: Buku Diktat - Fungsi Hashing

Contoh Konversi Kunci Menjadi Posisi

Fungsi HashingHash function atau fungsi hash adalah suatu cara menciptakan “fingerprint” dari berbagai data

masukan. Hash function akan mengganti atau mentranspose-kan data tersebut untuk menciptakan fingerprint, yang biasa disebut hash value. Hash value biasanya digambarkan sebagai suatu string pendek yang terdiri atas huruf dan angka yang terlihat random (data biner yang ditulis dalam notasi heksadesimal).

Suatu hash function adalah sebuah fungsi matematika, yang mengambil sebuah panjang variable string input, yang disebut pre-image dan mengkonversikannya ke sebuah string output dengan panjang yang tetap dan biasanya lebih kecil, yang disebut message digest5.

Hash function digunakan untuk melakukan fingerprint pada pre-image, yaitu menghasilkan sebuah nilai yang dapat menandai (mewakili) pre-image sesungguhnya.

Fungsi hash satu arah (one-way hash function) adalah hash function yang bekerja satu arah, yaitu suatu hash function yang dengan mudah dapat menghitung hash value dari pre-image, tetapi sangat sukar untuk menghitung pre-image dari hash value.

Sebuah fungsi hash satu arah, H(M), beroperasi pada suatu pre-image pesan M dengan panjang sembarang, dan mengembalikan nilai hash h yang memiliki panjang tetap. Dalam notasi matematika fungsi hash satu arah dapat ditulis sebagai:

h = H(M), dengan h memiliki panjang b

Ada banyak fungsi yang mampu menerima input dengan panjang sembarang dan menghasilkan output dengan panjang tetap, tetapi fungsi hash satu arah memiliki karakteristik tambahan yang membuatnya satu arah:

Diberikan M, mudah menghitung h.Diberikan h, sulit menghitung M agar H(M) = h.Diberikan M, sulit menemukan pesan lain, M’, agar H(M) = H(M’).

Dalam dunia nyata, fungsi hash satu arah dikembangkan berdasarkan ide sebuah fungsi kompresi. Fungsi satu arah ini menghasilkan nilai hash berukuran n bila diberikan input berukuran

Page 3: Buku Diktat - Fungsi Hashing

b. Input untuk fungsi kompresi adalah suatu blok pesan dan hasil blok teks sebelumnya, sehingga hash suatu blok M, adalah

hi = f(M1,h1-1)

denganhi = hash value saat iniMi = blok pesan saat inihi-1 = hash value blok teks sebelumnya

Secara umum fungsi hash (H) adalah fungsi untuk mengkonversikan himpunan kunci rekaman (K) menjadi himpunan alaman pengingat (posisi subskrib dalam larik / L) dan bisa dituliskan dengan menggunakan notasi

H : K → L

Dua aspek penting yang perlu dipertimbangkan dalam pemilihan fungsi hash adalah yang pertama, fungsi H harus mudah dan cepat dicari atau dihitung. Kedua, fungsi H sebisa mungkin mendistribusikan posisi yang dimaksud ssecara uniform sepanjang himpunan L, sehingga banyaknya tabrakan yang mungkin terjadi bisa diminimalkan. Secara alamiah, tidak ada garansi yang memungkinkan bahwa aspek kedua bisa dipenuhi tanpa terlebih dahulu mengetahui kunci-kunci yang ada. Meskipun demikian, ada beberapa metode untuk memotong-motong kunci dalam himpunan K menjadi kombinasi tertentu yang akan dipakai sebagai fungsi H.

Sebuah fungsi H yang memetakan key K pada suatu address dengan menggunakan suatu operasi aritmatik atau logika sederhana atas key-key atau bagian-bagian dari key sebagai dasar penyisipan atau pencarian dalam suatu tabel.

Berdasarkan cara pendisitribusian key, fungsi hashing dapat dikelompokkan menjadi 2:

1. Fungsi Distribution Independent

Division RemainderDalam cara ini kita bisa memlih suatu perubah m yang nilainya lebih besar

dibanding banyaknya kunci dalam K, misalnya n, dan biasanya dipilih suatu bilangan prima. Fungsi hashnya ditentukan sebagai :

H(k) = k mod m atau H(k) = k mod m + 1k: key yang dikonversikanm: bilangan prima yang mendekati tempat, yang disediakan untuk data

Persamaan pertama dipilih apabila diinginkan alamat kunci adalah 0 sampai m – 1. Persamaan kedua dipilih jika diinginkan alamat kunci adalah 1 sampai m.

Sebagai contoh, nomor mahasiswa terdiri dari 5 buah digit. Misalkan L terdiri dari 100 buah alamat yang masing-masing alamat terdiri dari 2 karakter : 00...99. Nomor mahasiswa yang diketahui misalnya 10347, 87492, 34212 dan 88688. Untuk menentukan alamat dari keempat nomor mahasiswa ini kita pilih suatu bilangan prima yang dekat dengan 99, misalnya m = 97. Dengan menggunakan fungsi H(k) = k mod m, diperoleh

H(10347) = 65, H(87492) = 95, H(34212) = 68, H(88688) = 30

Page 4: Buku Diktat - Fungsi Hashing

Dengan demikian, nomor mahasiswa 10347 akan disimpan dalam alamat 65, nomor mahasiswa 87492 akan disimpan dalam alamat 95, nomor mahasiswa 34212 akan disimpan dalam alamat 68 dan nomor mahasiswa 88688 akan disimpan dalam alamat 30. Jika dipilih fungsi H(k) = k mod m + 1, maka keempat nomor mahasiswa diatas masing-masing akan disimpan dalam alamat 66, 96, 69 dan 31.

FoldingDalam penjumlahan digit, kunci yang diketahui bisa dipecah menjadi beberapa

kelompok yang masing-masing terdiri dari beberapa buah digit, misalnya dua buah. Kemudian digit-digit dari kelompok-kelompok yang ada dijumlahkan. Pemecahan dan penjumlahan terus dilakukan jika jumlah keseluruhan kelompok yang ada masih lebih besar dari banyaknya alamat yang akan dipakai. Dengan menggunakan nomor mahasiswa di atas, maka alamat dari masing-masing nomor mahasiswa bisa ditentukan sebagai berikut (dalam hal ini digunakan kelompok dengan dua buah digit, karena alamatnya diketahui dari 00 sampai 99):

H(10347) = 1 + 03 + 47 = 51H(87492) = 8 + 74 + 92 = 174 = 1 + 74 = 75H(34212) = 3 + 42 + 12 = 57H(88688) = 8 + 86 + 88 = 182 = 1+ 82 = 83

MidsquareDalam metode ini, kunci yang diketahui dikuadratkan dan fungsi hash yang dipilih

adalah :H(k) = l

Nilai l diperoleh dengan menghapus digit-digit pada kedua sisi dari k2, dengan catatan bahwa banyaknya digit di sebelah kiri dan sebelah kanan harus sama. Jika tidak sama, maka pada digit di sebelah kiri seolah-olah ditambahkan sejumlah trailing zero, sehingga akan menghasilkan alamat yang benar.

Dengan menggunakan contoh yang sama dengan diatas, maka alamat dari masing-masing nomor mahasiswa diatas adalah :

Length depentH(x) = A1 + An + (n * Z)

A1 = ASCII karakter digit pertamaAn = ASCII karakter digit terakhirn = jumlah digitZ = kemungkinan macam karakter

Contoh: x = ‘K1347897’

n = 8 A1 = ‘K’ H(x) = ‘K’ + ‘7’ + (8 * 36)Z = 36 An = 7 = 75 + 55 + (8 * 36)

Angka 0-9 : 10 = 418Angka A-Z : 26

Radix Transformation

Page 5: Buku Diktat - Fungsi Hashing

Sebuah key yang dikodekan dalam radix q (q biasanya 2 atau 10) dianggap sebagai sebuah bilangan yang dinyatakan dalam radix p, dimana p lebih besar dari q serta p dan q adalah relative prima (yaitu “greatest common division” = 1).

Selanjutnya bilangan dalam radix p dikonversikan ke radix q dan alamat dibentuk dengan memilih beberapa digit (bit) yang kanan sesuai dengan address spacenya.

Contoh:Key (530476)10 dapat dianggap sebagai (530476)11. (530476)11 dikonversikan ke

radix 10 :5 . 115 + 3 . 114 + 4 . 112 + 7 . 111 + 6 . 110 = (849745)10

Bila lebar alamat = 3 digit maka alamat yang digunakan adalah1. Mengambil 3 digit sebelah kanan yaitu 745.2. Dengan fungsi hashing division remainder

H(x) = x mod m + 1 m = 997849745 mod 997 + 1 = . . .

2. Fungsi Distribution Dependent

Digit AnalysisUntuk mendapatkan harga fungsi ini, terlebih dahulu dilakukan penelitian terhadap

data yang diolah. Penelitian dilakukan dengan menghitung digit-digit yang muncul pada setiap digit dari key.

Hasil penelitian ditabelkan dan posisi digit yang mempunyai distribusi yang paling merata akan digunakan untuk menentukan lokasi data.Contoh:

5000 key yang terdiri dari 10 digit dari hasil penelitian didapatkan tabel :

DigitPosisi Key yang ke-

1 2 3 4 5 6 7 8 9 101 0 582 568 536 467 905 874 759 612 15812 0 571 620 531 563 553 657 606 542 5573 0 546 565 511 512 277 555 482 522 3324 0 518 529 495 461 0 214 521 546 05 0 503 503 500 463 673 276 469 472 06 0 488 456 469 510 629 263 296 426 07 0 449 411 500 459 0 272 365 425 08 0 422 431 470 457 501 159 310 455 09 0 390 323 489 518 741 155 59 438 00 5000 531 594 499 590 721 1565 1133 562 2540

Jangkauan Fmax - Fmin

5000-0 =

5000

582-390

= 192

620-323

= 297

536-469 = 67

590-457

= 133

905-0 = 905

1565-155 = 1410

1133-59 = 1074

612-425

= 187

2540-0 =

2540

Dari 5000 key yang terdiri dari 10 digit tersebut, posisi digit key yang digunakan untuk pengalamatan pada alamat (0, 1, …, 9999) adalah: posisi 2, 4, 5, 9 => karena selisih anatara frekuensi terbesar dan frekuensi terkecil dari keempat posisi tersebut adalah paling kecil dibandingkan posisi lainnya.

Contoh:Key 0 4 7 5 1 4 9 0 5 8 ditransformasikan ke alamat 4515

posisi

4 digit pilih 4 posisi

1 24

45

51

95

3 6 7 8 10

Page 6: Buku Diktat - Fungsi Hashing

Ada 2 sifat yang perlu diperhatikan dalam pemilihan fungsi hashing:1. Memiliki kecepatan yang tinggi dalam perhitungan untuk memperoleh alamat dari key. Karena

waktu yang dibutuhkan utnuk proses perhitungan dianggap juga sebagai bagian dari waktu pencarian.

2. Alamat-alamat key-key yang dihasilkan dari perhitungan fungsi hashing harus merata sehingga tidak menyebabkan terjadinya clustering akibat banyaknya collision yang dihasilkan.

Clustering : gerombolan dataCollision : alamat yang sama untuk key-key yang berbeda.

Contoh:Fungsi hashing yang digunakan: Division Remainder

H(x) = x mod m

Pada tabel T ada 7 lokasi kosong (lokasi 0 . . . 6) sehingga m = 7x = 2 H(x) = 2 mod 7 = 2x = 10 H(x) = 10 mod 7 = 3x = 19 H(x) = 19 mod 7 = 5

Tabel T012 23 1045 196

Selanjutnya akan diinsertkan secara berturut-turut key 14, 24, 23 pada tabel Tx = 14 H(x) = 14 mod 7 = 0

Tabel T0 1412 23 1045 196

x = 24 H(x) = 24 mod 7 = 3Lokasi 3 pada Tabel T telah terisi oleh key x = 10. Keadaan inilah yang disebut dengan

Collision { x1 ≠ x2 tetapi H(x1) = H(x2)}. Collision ini diatasi dengan Collision Resolution Technique / Collision Resolution Policy.

Teknik Collision Resolution

Open Addressing / Closed Hashing:

a. Linear Probing

Page 7: Buku Diktat - Fungsi Hashing

Colliding Record diletakkan pada lokasi (probe increment 1) berikutnya. Bila hasil dari fungsi hash adalah lokasi d yang ternyata telah terisi, maka colliding record yang terjadi diletakkan pada lokasi :

d+1, d+2, . . ., N (jumlah lokasi), 1, 2, 3, . . ., d-1

Contoh:o Insert secara berturut-turut: 1, 9, 18, 14 dengan fungsi hashing h(x) = x mod m+ 1 di

mana m = 7x = 1 h(x) = 1 mod 7 + 1 = 2x = 9 h(x) = 9 mod 7 + 1 = 3x = 18 h(x) = 18 mod 7 + 1 = 5x = 14 h(x) = 14 mod 7 + 1 = 1

1 142 13 945 1867

o Kemudian insert 25x = 25 h(x) = 25 mod 7 + 1 = 5

1 142 13 945 186 257

o Kemudian insert 35x = 35 h(x) = 35 mod 7 + 1 = 1

1 142 13 94 355 186 257

Colliding Record diletakkan pada lokasi sebelumnya (disebut dengan probe increment 1). Bila hasil dari fungsi hash adalah lokasi d yang ternyata telah terisi, maka colliding record yang terjadi diletakkan pada lokasi :

d-1, d-2, d-3, . . ., 3, 2, 1, N, m-1, m-2, . . ., d+1

Contoh:o Insert secara berturut-turut: 1, 9, 18, 14 dengan fungsi hashing h(x) = x mod m+ 1 di

mana m = 7x = 1 h(x) = 1 mod 7 + 1 = 2x = 9 h(x) = 9 mod 7 + 1 = 3x = 18 h(x) = 18 mod 7 + 1 = 5x = 14 h(x) = 14 mod 7 + 1 = 1

h(25) : first probe at collision address 5

second probe at occupied location 6

h(35) : first probe at collision address 1second probe at collision address 2third probe at collision address 3fourth probe at occupied location 4

Page 8: Buku Diktat - Fungsi Hashing

1 142 13 945 1867

o Kemudian insert 25x = 25 h(x) = 25 mod 7 + 1 = 5

1 142 13 945 256 187

o Kemudian insert 37x = 37 h(x) = 37 mod 7 + 1 = 3

1 142 13 94 255 1867 37

b. Random ProbingKey diletakkan pada lokasi berikutnya dengan penambahan P (dimana P adalah

bilangan prima yang bukan faktor dari jumlah lokasi)

CP (CP + P) mod N + 1

Contoh:N = jumlah lokasi = 11P = 7Lokasi-lokasi untuk A, Z, E, D, F adalah 3 maka dengan Random Probing :12 F3 A45 D678 E9

1011 Z

fourth probe at empty location 7

second probe at occupied location 4

h(25) : first probe at collision address 5

third probe at collision address 1second probe at collision address 2h(37) : first probe at collision address 3

relatif prima

bilangan prima

jumlah lokasi

- Lokasi Z : (3 + 7) mod 11 + 1 = 11Misal di 11 sudah terisi maka lokasi Z berikutnya : (11 + 7) mod 11 + 1 = 8

- Lokasi E : (3 + 7) mod 11 + 1 = 11Karena Z telah menempati lokasi 11 maka lokasi E : (11 + 7) mod 11 + 1 = 8

- Lokasi D : (3 + 7) mod 11 + 1 = 11 sudah terisiLokasi D : (11 + 7) mod 11 + 1 = 8 sudah terisiLokasi D : (8 + 7) mod 11 + 1 = 5

- Lokasi F : (3 + 7) mod 11 + 1 = 11 sudah terisiLokasi F : (11 + 7) mod 11 + 1 = 8 sudah terisiLokasi F : (8 + 7) mod 11 + 1 = 5 sudah terisiLokasi F : (5 + 7) mod 11 + 1 = 2

Page 9: Buku Diktat - Fungsi Hashing

Y = initial positionC = relative primaN = table size

Contoh:N = 11, c = 5, y = 2 maka

y = (2 + 5) mod 11 = 7y = (7 + 5) mod 11 = 1y = (1 + 5) mod 11 = 6y = (6 + 5) mod 11 = 0y = (0 + 5) mod 11 = 5y = (5 + 5) mod 11 = 10y = (10 + 5) mod 11 = 4y = (4 + 5) mod 11 = 9y = (9 + 5) mod 11 = 3y = (3 + 5) mod 11 = 8y = (8 + 5) mod 11 = 2

Jadi, urutan alamat yang dihasilkan adalah 7, 1, 6, 0, 5, 10, 4, 9, 3, 8, 2

c. Quadratic ProbingBila hasil fungsi hash adalah d maka colliding record akan diletakkan pada lokasi

(d+1) mod S, (d+4) mod S, (d+9) mod S, …, (d+i2) mod SS = table size

Contoh:Berikut adalah table hash dengan fungsi hash h(x) = x mod m (m = 11) dan teknik

mengatasi collision menggunakan quadratic probing

NO Empty TotalInsert

28Insert

54Insert

84Insert

116Insert 5

01234 116 1165 56 28 28 28 28 287 84 84 8489

10 54 54 54 54

28 h(x) = 28 mod 11 = 654 h(x) = 54 mod 11 = 1084 h(x) = 84 mod 11 = 7116 h(x) = 116 mod 11 = 6 collisionDengan quadratic probing = (6 + 1) mod 11 = 7 collision

(6 + 4) mod 11 = 10 collision

y (y + c) mod N

Page 10: Buku Diktat - Fungsi Hashing

(6 + 9) mod 11 = 45 h(x) = 5 mod 11 = 5

d. Double HashingH1(x) = x mod NH2(x) = (x mod (N – 2)) + 1N = table size

y = (y + c) mod N di mana y = H1(x) dan c = H2(x)

Contoh:N = 11x = 75 H1(75) = 75 mod 11 = 9

H2(75) = (75 mod 9) + 1 = 4 y = 9, c = 4

y = (y + c) mod 11y = (9 + 4) mod 11 = 2y = (2 + 4) mod 11 = 6y = (6 + 4) mod 11 = 10y = (10 + 4) mod 11 = 3y = (3 + 4) mod 11 = 7y = (7 + 4) mod 11 = 0y = (0 + 4) mod 11 = 4y = (4 + 4) mod 11 = 8y = (8 + 4) mod 11 = 1y = (1 + 4) mod 11 = 5Urutan alamat yang dihasilkan adalah 9, 2, 6, 10, 3, 7, 0, 4, 8, 1, 5

x = 42 H1(42) = 42 mod 11 = 9 H2(42) = (42 mod 9) + 1 = 7 y = 9, c = 7 y = (y + c) mod 11

dihasilkan urutan alamat: 9, 5, 1, 8, 4, 0, 7, 3, 10, 6, 2

Terlihat bahwa walaupun H1(75) = H1(42) = 9 tetapi dihasilkan 2 urutan alamat yang berbeda

Jika terjadi collision pada alamat yang dihasilkan fungsi hash H1, maka digunakan fungsi probe decrement untuk mencari lokasi kosong.

Fungsi Probe Decrement didefinisikan sebagai :p(x) = Max(1, x div m)m = bilangan prima terdekat yang ≤ jumlah lokasi.

Contoh:Insert secara berturut-turut: 9, 18, 14, 26 dengan fungsi hashing h(x) = x mod 7 + 1.

x = 9 h(x) = 9 mod 7 + 1 = 3x = 18 h(x) = 18 mod 7 + 1 = 5x = 14 h(x) = 14 mod 7 + 1 = 1x = 26 h(x) = 26 mod 7 + 1 = 6

Kemudian insert 25x = 25 h(x) = 25 mod 7 + 1 = 5

1 1423 945 186 267

Page 11: Buku Diktat - Fungsi Hashing

second probe at collision address 6

terjadi collision, gunakan fungsi probe decrement

1 142 253 945 186 267

p(x) = max(1, 25 div 7) = max (1, 3)p(x) = 3 sehingga lokasi x = 5 – 3 = 2

Kemudian insert 46h(x) = 46 mod 7 + 1 = 5 terjadi collision, gunakan fungsi probe decrement

p(x) = max(1, 46 div 7) = max(1, 6)

1 142 253 945 186 267 46

Function Insert_Open_Addressing(K, Info, x, InfoR)[Harga Awal]d hash(x) RV = 0 Table fullRV 0 RV = + Inserted at Rec (RV)CP d RV = - Duplicate Key

[Proses]Repeat until CP = d

If K[CP] = x {duplicate key}then

RV -CPCP d

else if K[CP] = ‘ ’ or K[CP] = ‘**’then

K[CP] xInfo[CP] InfoRRV CPCP d

else CP (CP mod m) + 1

[Selesai]Return (RV)

K, Info = Vektorx = key yang mau diinsertkan

Function Get_Open_Addressing(K, Info, x, InfoR)[Harga Awal]

h(46) : first probe at collision address 5

second probe at occupied location 2h(25) : first probe at collision address 5

third probe at occupied location 7

Page 12: Buku Diktat - Fungsi Hashing

d hash(x) RV = 0 found at Rec (RV)RV 0 RV = + not foundCP d RV = - not found

[Proses]Repeat until CP = d

If K[CP] = x {x is found}then

RV CPCP d

else if K[CP] = ‘ ’ or K[CP] = ‘**’then If K[CP] = ‘ ’

then RV -CPCP d

else CP (CP mod m) + 1CP d

else CP (CP mod m) + 1

[Selesai]Return (RV)

Chaining Addressing / Open Hashing / Separate Chaining :Penggandengan (chaining) merupakan metode lain yang digunakan untuk mengatasi

kemungkinan adanya tabrakan alamat hash. Metode ini pada prinsipnya memanfaatkan senarai berantai (yang juga bisa diimplementasikan menggunakan larik) yang dipasang pada setiap alamat hash yang diketahui. Dengan demikian, kita bisa melihat pada sebuah alamat hash lengkap dan senarai yang menyimpan rekaman-rekaman yang mempunyai alamat hash yang sama, maka kita akan melihat adanya sebuah senarai berantai tunggal berkepala dengan kepalanya adalah alamat hash.

Sebagai contoh, jika kita mempunyai rekaman-rekaman yang kunci rekamannya bisa dituliskan sebagai

34 56 123 78 93 70 100 21 11 77 28

dan fungsi hash yang dipilih adalah k mod 10. Dengan demikian, alamat hash akan terdiri dari sepuluh buah alamat yang bernomor 0 sampai 9. Gambar 2.2 menunjukkan alamat hash lengkap dengan senarai berantainya untuk menyimpan rekaman-rekaman diatas.

Page 13: Buku Diktat - Fungsi Hashing

Contoh Penggandengan Alamat hash

Dengan memperhatikan gambar di atas, kita bisa menyusun struktur data untuk menyajikan metode penggandengan dengan menggunakan link list, misalnya

Struct Rekaman{int Kunci;char Info;Rekaman *Berikut;

};Rekaman Hash[10];

Deklarasi Metode Penggandengan dengan Link List

2 key berbeda dipetakan dengan fungsi hash dan menghasilkan lokasi yang sama disebut Colliding Record. Hal tersebut diatasi dengan Collision Resolution Technique.

Insert secara berturut-turut: 0, 15, 1, 38, 11, 10, 49, 26 dengan fungsi hash adalah x mod m + 1; m = 11.

x = 0 h(x) = 0 mod 11 + 1 = 1x = 15 h(x) = 0 mod 11 + 1 = 5x = 1 h(x) = 0 mod 11 + 1 = 2x = 38 h(x) = 0 mod 11 + 1 = 6x = 11 h(x) = 0 mod 11 + 1 = 1x = 10 h(x) = 0 mod 11 + 1 = 11x = 49 h(x) = 0 mod 11 + 1 = 6x = 26 h(x) = 0 mod 11 + 1 = 5

Type declaration for open hash tabletype

Position = ^Node;Node = Record

Element : ElementType;Next : Position;

end;

HashTable = array[…] of Position;

Procedure InitializeTable (H){ inisialisasi hash Table H}

[Proses Inisialisasi]Repeat for i = 1 to tablesize

123456789

1011

11 0

1

26 15

49 38

10

Page 14: Buku Diktat - Fungsi Hashing

New(H[i])If H[i] = nil

then write(‘error’)exit

else H[i]^: Next nil[Selesai]

Return

function find(x, H) : position{ find = nil Key x tidak ditemukan}

[Proses Pencarian]List H[hash(x)]P List ^. NextRepeat while P <> Nil and P^.element <> x

P P^.Next

[Selesai]Return (P)

Procedure Insertfirst(x, H){insert x at the front of the list if x is not in the

list}

[Proses]Pos find(x, H)If Pos = nil N {x is not found}

then new(node)if node = nil

then write(‘error’)exit

else List H[hash(x)]node^.Next List^.Nextnode^.element xList^.Next node

[Selesai]Exit

KELEBIHAN DAN KELEMAHAN MODEL HASHING Model Hash memiliki kelemahan pada saat penambahan dan penghapusan record. Diperlukan

waktu untuk menstrukturisasi tabel Hash. Pada tabelHash terdapat suatu daerah (akibat collision) kelebihan data (overflow). Untuk mencapai daerah tersebut, memerlukan waktu. Lamanya waktu disebabkan jika data diletakkan dalam disk.

Kelemahan – Kelemahan Fungsi Hash:Desain kriptografi fungsi hash yang ada saat ini, termasuk MD4, MD5, SHA-0, SHA-1,

keluarga SHA-2, RIPEMD, Whirlpool, Tiger, mengikuti struktur MD (Merkle and Damgård).Karena fungsi hash H : {0,1}* → {0,1}n harus menangani input-input yang panjang, maka

dirancanglah sebuah fungsi kompresi internal C: {0,1}n x {0,1}m → {0,1}n dengan ukuran input yang tetap, untuk memecah message M ke dalam m bit blok M[1], ... , M[L], dan untuk menghitung hash secara strightforward menggunakan iterasi kompresi C seperti yang ditunjukkan pada gambar berikut :

Page 15: Buku Diktat - Fungsi Hashing

Gambar 3.1 Iterasi Struktur Merkle and Damgård untuk Fungsi Hash

Fungsi hash h akan resisten terhadap collision jika fungsi kompresinya resisten terhadap collision. Ini akan menjadi keunggulan dari struktur MD. Sayangnya terdapat pula kelemahan struktur MD, yaitu failure-unfriendly, yang menyebabkan fungsi hash gagal dan tidak seperti yang diharapkan.