Hash чист ва чӣ тавр дар луғатҳо дар Python истифода мешавад?
sobes.tech AI
Ҷавоб аз AI
Ҳеш (ёҳалат ё ҳош) арзиши рақамӣ бо дарозии муайян буда, асосан аз мундариҷаи объект тавассути функсияи ҳеш ҳисоб карда мешавад. Функсияи ҳеши хуб кафолат медиҳад детерминизм (яъне, ҳамон объект ҳамеша ҳеши якхела медиҳад) ва кӯшиш мекунад, ки тақсимоти баробар дар байни объектҳои гуногун дошта бошад.
Дар Python, луғатҳо (типы dict) барои нигоҳдории муассир ва ҷустуҷӯи ҷуфтҳои "калид-арзиш" истифодаи ҳешро мекунанд. Калидҳо бояд ҳешшаванда бошанд, яъне бояд методи __hash__() дошта бошанд ва имутобил ё дорои иҷрои __eq__() ва __hash__() бошанд, ки калидҳои баробар ҳеши баробар дошта бошанд.
Раванди кор бо ҳешҳо дар луғат:
- Илова: Вақте ки ҷуфт (калид, арзиш) илова карда мешавад, ҳеши калид ҳисоб карда мешавад. Аз ҳеши он ҷойи тақрибӣ (бастаи ё "бақа") барои нигоҳдории он дар ёддошт муайян карда мешавад. Агар чанд калид ҳеши якхела дошта бошанд (коллизия), онҳо дар ҳамин бақа нигоҳ дошта мешаванд, одатан дар шакли рӯйхати пайваст ё механизми дигар барои ҳалли коллизия.
- Ҷустуҷӯ: Вақте ки арзишро дар асоси калид меҷӯем, ҳеши калид ҳисоб карда мешавад. Бо ёрии ҳеш, луғат ба зудӣ бақа мувофиқро пайдо мекунад. Пас дар дохили он бақа, муқоиса байни калидҳо (бо истифода аз
__eq__()) барои ёфтани калиди лозим ва гирифтани арзиши вобаста ба он сурат мегирад.
Манфиатҳои истифодаи ҳеш:
- Самаранокӣ: Операцияҳои илова кардан, тоза кардан ва ҷустуҷӯ дар луғат дар миёнаравӣ бо вақти доимӣ O(1) иҷро мешаванд, новобаста аз андозаи луғат.
- Дастрасии зуд: Ҳеш имкон медиҳад, ки ба ҷойи эҳтимолии нигоҳдории маълумот зуд гузаред, аз пешгирӣ кардани санҷиши ҳамаи унсурҳо.
Маҳдудиятҳо ва хусусиятҳо:
- Калидҳои ҳешшаванда: Чун ки дар боло зикр шуд, калидҳо бояд ҳешшаванда бошанд. Типҳои тағйирёбанда, мисли рӯйхатҳо (
list) ва маҷмӯъҳо (set), ба таври пешфарз ҳешшаванда нестанд ва наметавонанд ҳамчун калид истифода шаванд. - Коллизияҳо: Ҳарчанд функсияҳои ҳеш кӯшиш мекунанд, ки коллизияҳоро кам кунанд, онҳо метавонанд рӯй диҳанд, ки метавонад дар ҳолати бадтаркорӣ, каме сусттар кунанд (ба константа дар O(1) таъсир мерасонад).
- Тартиб: То Python 3.7, тартиби унсурҳо дар луғат аз тартиби илова ва ҳеши калидҳо вобаста буд. Аз Python 3.7, луғатҳо тартиби иловаи калидҳоро нигоҳ медоранд, ҳамчун таъсири тараф аз иҷроиш, аммо ин қисми механизми ҳеш нест.
Масаланҳои объектҳои ҳешшаванда ва ғайриҳешшаванда:
# Объекти ҳешшаванда (бе тағйирёбанда)
string_key = "hello"
int_key = 123
tuple_key = (1, 2)
print(hash(string_key))
print(hash(int_key))
print(hash(tuple_key))
# Объекти ғайриҳешшаванда (тағйирёбанда)
list_key = [1, 2]
# print(hash(list_key)) # Ин TypeError ба вуҷуд меорад
# Мисол барои истифода дар луғат
my_dict = {
string_key: "world",
int_key: 456,
tuple_key: "тупле"
}
print(my_dict[string_key])
print(my_dict[int_key])
print(my_dict[tuple_key])
Ҳамин тавр, ҳеш як механизми асосӣ аст, ки имкон медиҳад луғатҳо дар Python ба баландтарин самаранокӣ дар иҷрои операцияҳо, ки асосан ба ҳисоб кардани зуд ва дақиқи тасвирии рақамии калидҳо асос ёфтаанд, расанд.