แฮชชิงคู่
แฮชชิ่งคู่ (อังกฤษ: Double Hashing) เป็นเทคนิคการเขียนโปรแกรมคอมพิวเตอร์ โดยใช้ตารางแฮชเพื่อป้องกันการชนกันของแฮช ในกรณีที่สองค่าที่แตกกต่างกันค้นหาคีย์แฮชเดียวกัน ซึ่งการแฮชสองชั้นเป็นเทคนิค Open Address การแฮชแบบสองชั้นถูกนำไปใช้ในคลังโปรแกรมที่นิยมมาก
หลักการทำงาน
[แก้]1. กำหนดความกว้างของตารางแฮช และ ค่าที่ใช้เพื่อเลื่อนค่าจากตำแหน่งเดิม
2. กำหนดข้อมูลที่เราต้องการ อย่างตัวอย่างจะกำหนดให้คือ 26, 54, 94, 17, 31, 77, 44 และ 51 ความกว้างของตาราง คือ 13 ค่าที่ใช้เพื่อเลื่อนค่าจากตำแหน่งเดิม คือ 5
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
None | None | None | None | None | None | None | None | None | None | None | None | None |
3. นำข้อมูลที่กำหนดให้มาคำนวณ โดย ข้อมูล ณ ตำแหน่งที่ Mod ความกว้างของตาราง () จะได้ ซึ่งเป็นค่าในตำแหน่งของตารางแฮช แล้วทำต่อให้ครบทุกค่า
26 | 54 | 94 | 17 | 31 | 77 | 44 | 51 |
0 | 2 | 3 | 4 | 5 | 12 | 5 | 12 |
4. หาค่าการแฮชสองชั้นโดยใช้ ค่าที่ใช้เพื่อเลื่อนค่าจากตำแหน่งเดิม ลบกับ ข้อมูล ณ ตำแหน่งที่ Mod ค่าที่ใช้เพื่อเลื่อนค่าจากตำแหน่งเดิม ( ) จะได้
26 | 54 | 94 | 17 | 31 | 77 | 44 | 51 |
4 | 1 | 1 | 3 | 4 | 3 | 1 | 4 |
5. นำค่าที่ได้ในข้อที่ 3 ไปใส่ยังตารางในข้อที่ 2
5.1 ค่า 26 ตำแหน่งที่ 0
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
26 | None | None | None | None | None | None | None | None | None | None | None | None |
5.2 ค่า 54 ตำแหน่งที่ 2
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
26 | None | 54 | None | None | None | None | None | None | None | None | None | None |
5.3 ค่า 94 ตำแหน่งที่ 3
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
26 | None | 54 | 94 | None | None | None | None | None | None | None | None | None |
5.4 ค่า 17 ตำแหน่งที่ 4
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
26 | None | 54 | 94 | 17 | None | None | None | None | None | None | None | None |
5.5 ค่า 31 ตำแหน่งที่ 5
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
26 | None | 54 | 94 | 17 | 31 | None | None | None | None | None | None | None |
5.6 ค่า 77 ตำแหน่งที่ 12
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
26 | None | 54 | 94 | 17 | 31 | None | None | None | None | None | None | 77 |
5.7 ค่า 44 ตำแหน่งที่ 5 (กรณีค่าที่ตำแหน่งทับกัน จะนำค่าจากตารางในข้อที่ 4 มา บวกกับ ค่าตารางที่ 1 จะได้ 5 + 1 แล้ว Mod ด้วยความกว้างของตารางแฮช จะเท่ากับ 6)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
26 | None | 54 | 94 | 17 | 31
44 |
None | None | None | None | None | None | 77 |
เมื่อได้ค่าเท่ากับ 6 แล้ว จะเป็นค่าตำแหน่งใหม่ที่ใส่ลงในตาราง
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
26 | None | 54 | 94 | 17 | 31 | None | None | None | None | None | None | 77 |
ค่า 51 ตำแหน่งที่ 12 (กรณีค่าที่ตำแหน่งทับกัน จะนำค่าจากตารางในข้อที่ 4 มา บวกกับ ค่าตารางที่ 1 จะได้ 12 + 4 แล้ว Mod ด้วยความกว้างของตารางแฮช จะเท่ากับ 3)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
26 | None | 54 | 94 | 17 | 31 | 44 | None | None | None | None | None | 77
51 |
เมื่อได้ค่าเท่ากับ 3 แล้ว จะเป็นค่าตำแหน่งใหม่ที่ใส่ลงในตาราง แต่เมื่อกรณียังมีค่าในตารางให้นับเพิ่มอีก 3
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
26 | None | 54
51 |
94 | 17 | 31 | 44 | None | None | None | None | None | 77 |
กรณียังมีค่าในตารางให้นับเพิ่มอีก 3
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
26 | None | 54 | 94 | 17 | 31
51 |
44 | None | None | None | None | None | 77 |
กรณียังมีค่าในตารางให้นับเพิ่มอีก 3 แต่เมื่อเจอช่องที่ว่างเปล่า สามารถนำค่านั้นลงในตารางได้ทันที
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
26 | None | 54 | 94 | 17 | 31 | 44 | None | None | None | None | None | 77 |
ความซับซ้อนในการทำงาน
[แก้]จะสรุปได้ว่า Big(O) = O() Best Case คือ ขนาดของข้อมูลเป็น 0 มีค่าเดียว หรือข้อมูลมีค่ามากกว่าตาราง O(1) Worst Case คือ ขนาดของข้อมูลที่ให้ฟังก์ชั่นทำงานครบทั้งหมด O()
ตัวอย่างการเขียนโปรแกรม
[แก้]def doubleHashing(data, hashTableSize, doubleHashSize):
if len(data) > hashTableSize:
return None
listOfHashTable = [None] * hashTableSize
for i in range(len(data)):
primaryHash = data[i] % hashTableSize
doubleHash = primaryHash
if listOfHashTable[primaryHash] is None:
listOfHashTable[primaryHash] = data[i]
else:
while listOfHashTable[doubleHash] is not None:
secondary = doubleHashSize - (data[i] % doubleHashSize)
doubleHash = (doubleHash + secondary) % hashTableSize
listOfHashTable[doubleHash] = data[i]
return listOfHashTable
อ้างอิง
[แก้]Mohit Makhija . Double Hashing Code2begin. Retrieved 1 May 2018.