![]() |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
Index (Hashovací klíč) | Hodnota |
---|---|
0 | 16 |
1 | 9 |
2 | 42 |
3 | 11 |
4 | 12 |
5 | 61 |
6 | 6 |
Je jistě vidět, že vyhledávat v hashovací tabulce není nic složitého. Samozřejmě mnohem lepší by bylo si na vyhledávání napsat jednoduchou funkci, která by vracela true nebo false. V této ukázce však šlo pouze o pochopení, jak hashování funguje.
Vraťme se ješte na chvíli k předešlému příkladu. Naše hashovací funkce vracela zbytek po dělení osmi, což znamená, že hashovací klíč byl vždy v intervalu <0, 7>. To může být docela problém, neboť rozsah klíčů není velký a může proto velmi snadno dojít ke kolizi. Kolizí rozumíme to, jestliže dvě hodnoty získají stejný hashovací klíč - například čísla 27 a 11 mají obě hashovací klíč roven 3 (u naší hashovací funkce). To je problém, neboť v našem poli je u hashovacího klíče vždy jen jedno místo. Proto je snad již zcela zřejmé, že předchozí příklad neměl reálné využití. Jak tedy kolize řešit?
Asi nejlepším způsobem by bylo navrhnout hashovací funkci tak, aby každé hodnotě přiřadila různý klíč. Toho by šlo dosáhnout tak, že by se hashovací funkce chovala náhodně. V tom je však skryt další problém. Hashovací funkce musí být navržena tak, aby vždy pro danou hodnotu vypočítala stejný hashovací klíč - proto se hashovací funkce nemůže chovat náhodně. Kolize lze tedy řešit například separátním řetězením.
Princip separátního řetězení je takový, že každé hodnotě hashovacího klíče je přiřazena datová struktura seznam, do kterého se ukládají hodnoty. Jinak řečeno, hodnoty se stejným hashovacím klíčem se ukladájí do stejného seznamu. Tím se však zvyšuje časová složitost vyhledání hodnoty v hashovací tabulce. Časová složitost je úměrná délce seznamu, který je asociován s patřičným hashovacím klíčem. V absolutně nejhorším případě by se mohlo stát, že by se všechny hodnoty hashovaly na stejný hashovací klíč, tudíž by se ukládaly do stejného seznamu. V tomto případě by pak časová složitost na vyhledání hodnoty byla přímo děsivá. Je tedy nutné dobře navrhnout hashovací funkci, aby ke kolizím docházelo co možná nejméně často.
Ukázku, jakým způsobem je možno separátní řetězení naimplementovat, naleznete zde. Je to trochu delší kód, proto jsem ho zde dal ke stažení. Program slouží k uložení různě dlouhých řetězců do hashovací tabulky. Pokud si kód budete chtít vylepšit, můžete si několik řetězců uložit do textového souboru, ty pak v programu načíst a uložit do hashovací tabulky. Pak je můžete zkusit vyhledávat. Udělal jsem hashovací tabulku na 50 hashovacích klíčů, není však problém tuto tabulku zvětšit - stačí v kódu změnit hodnotu konstanty n. Každý prvek hashovací tabulky představuje datovou strukturu seznam, čili při výskytu stejných hashovacích klíčů se data ukládájí do stejného seznamu. Ještě podotýkám, že jsem implementoval pouze metody pro přidávání a hledaní prvků, metoda, která bude prvky mazat, není nikterak složitá.
Jistě jste se někdy setkali například s pojmem CRC (Cyclic Redundancy Check, cyklický redundantní součet). Není to nic jiného, než hashovací funkce, která se používá při přenosu nebo při ukládání dat, čili slouží k detekci chyb v datech. To, jak přesně CRC funguje, je myslím zbytečné psát, neboť o tom se určitě najde článků dost. Mezi další hashovací funkce patří například MD-5 nebo SHA-1.
|
||||
KOMENTARZE | ||||
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
|
1. |
Pacman linux Download: 5004x |
2. |
FreeBSD Download: 9214x |
3. |
PCLinuxOS-2010 Download: 8700x |
4. |
alcolix Download: 11096x |
5. |
Onebase Linux Download: 9809x |
6. |
Novell Linux Desktop Download: 0x |
7. |
KateOS Download: 6372x |
1. |
xinetd Download: 2535x |
2. |
RDGS Download: 937x |
3. |
spkg Download: 5040x |
4. |
LinPacker Download: 10209x |
5. |
VFU File Manager Download: 3311x |
6. |
LeftHand Mała Księgowość Download: 7340x |
7. |
MISU pyFotoResize Download: 2973x |
8. |
Lefthand CRM Download: 3673x |
9. |
MetadataExtractor Download: 0x |
10. |
RCP100 Download: 3270x |
11. |
Predaj softveru Download: 0x |
12. |
MSH Free Autoresponder Download: 0x |