it-place.net > Уроци > Други
Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

   Рубрики
 
 
 
 

 Форуми
» SEO и оптимизация
» Всичко за PHP и Perl
» Всичко за C, C++ и .NET
» Всичко за Java и JSP
» Всичко за SQL и MySQL
» Всичко за XHTML и CSS
» Презентация на сайтове
 Хеширане - основни понятия.
  1. Що е то хеширане
  2. за какво се използва
  3. Справяне с колизиите
  4. Алгоритми за хеширане
  5. Пароли, идентификация
     
Автор  johnfound (29.07.2004 22:38)  съобщение до автора
Погледнат  4807 пъти  добави към любими
Оценка  добави коментар
Гласове  13  изпрати на приятел
Коментари  (1)  абонирай се за Други
    Страница 3 / 5

 



Справяне с колизиите.

    Справянето с колизиите се състои от две части:
    1. Намаляване на вероятността за възникване на колизии.
    2. Справяне с колизиите, които все пак възникват.
   
    За точка 1 - избираме по-голям хеш, избираме подходяща хеш функция, която дава по-малко колизии за типичните входни данни.
   
    За точка 2 - има няколко начина да се справим с колизиите. Всички те имат предимства и недостатъци и най-общо трябва да се избира в зависимост от конкретната задача. Тук ще разгледаме няколко такива:
   
    а. Затворено хеширане.
    Идеята е, че се използва само наличната хеш таблица, без да се отделя повече място в паметта за решаване на колизиите.
    Това намалява използваната памет, но очевидно в такава таблица можем да добавим ограничен брой стрингове - точно колкото е размера на таблицата.
    Когато при добавяне на стринг в хеш таблицата се стигне до колизия (тоест на мястото където искаме да запишем стринга има вече друг стринг със същият хеш), просто записваме новият стринг на следващото свободно място в таблицата.
    При търсене, алгоритъмът е същият: Ако на мястото в таблицата има записан стринг, но той не е този който търсим, поглеждаме на следващият елемент. Ако и там не е нашият стринг - на следващият и така нататък, докато открием нашият стринг или 0 - което ще значи, че този стринг го няма в масива.
    Забелязахте ли как, при наличие на колизия, този алгоритъм се превръща в обикновенно сканиране. Това може драстично да свали скоростта на целият алгоритъм. Затова колизиите са толкова вредни и трябва да се вземат всички мерки за недопускането им.
   
    б. Отворено хеширане
    Идеята е, че когато се получи колизия, на съответното място в таблицата, записваме не указател към стринг, а указател към списък от стрингове, където записваме различните стрингове с еднакви хешове.
    Това позволява да се записват неограничено количество стрингове в таблицата. Разбира се при търсене, ако срещнем колизия - тоест указател към списък, този списък пак ще трябва да го сканираме елемент по елемент (или по накакъв друг начин - например с двоично търсене) за да установим има ли го нашият стринг или не.
   
    в. Двойно хеширане.
    Идеята е - при попълване на таблицата, ако срещнем колизия, изчисляваме втора хеш стойност със <b>друг</b> алгоритъм и хешираме стринга във втора таблица. При търсене, ако стринга записан във първата таблица не съвпада, изчисляване вторият хеш за търсеният стринг и гледаме във втората таблица.
    Разбира се във втората таблица също ще са възможни колизии и те трябва да се решат с някакъв друг метод. Но такива колизии ще възникват значително по-рядко и затова ще влияят слабо на скоростта на алгоритъма.
   
    г. Динамично изграждане на хеш таблицата
   
    Като най-общо правило,(сигурно сте забелявали вече) винаги се стремим да използваме най-големият възможен размер на хеш таблиците, за да избегнем колизиите и деградирането на скоростта.
    От друга страна обаче сме ограничени от размера на наличната памет, а и тъй като огромната хеш таблица е обикновенно пълна с много нули и малко данни - чувството, че прахосваме памет е особенно силно.
    Можем да опитаме малко по нетривиално решение: Избираме голям размер на хеша (например 32бита или 64 бита) но не създаваме хеш таблицата в паметта (че как бихме могли? - за упражнение можете да пресметнете колко памет изисква 32битова хеш таблица, ако всеки елемент е указател), а я изграждаме в процеса на добавяне на стрингове в нея, като в паметта записваме само частта от таблицата, която е запълнена в момента.
    Как става това: Сканираме хеша на стринга бит по бит, като всеки бит служи за разклонение на съответното ниво на едно двоично дърво. На последният ред на дървото имаме указатели към стринговете. Възли в дървото прибавяме само когато възникне нужда от тях, така че в паметта винаги имаме само частта на таблицата, която е запълнена с данни.
   
    Този алгоритъм осигурява също константно време за търсене независещо от броя на стринговете в масива, защото претърсването на дървото е винаги постоянно и зависи само от дължината на хеш стойността = дълбочината на дървото. Разбира се това време е по-голямо отколкото директна проверка в таблицата, но по-голямата дължина на хеша - съответно малкият брой колизии, компенсират това забавяне с голяма печалба ако броят на стринговете в таблицата е много голям.
   



 << Предишна страница Следваща страница >> 


Ключови думи: хеш начинаещи програмиране хеширане


Още уроци от тази рубрика


 
  • Подобни теми от myLinks
 

 За автора: johnfound  
Занимавам се с програмиране от 1983 година. Експерт по програмиране на Delphi и Assembler. Разбира се понякога работя и на PHP, Perl и др.под. В момента се занимавам с програмиране на автоматизирани системи за производство в голяма немска фирма в България. От 2003г започнах проект с отворен код, целта на който е разработката на съвременна среда и средства за програмиране на асемблер под Windows, конкурентна на езиците от високо ниво. Подробности за проекта можете да намерите на: http://fresh.flatassembler.net
   
 1 посетител чете този урок (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

Браво! Чудесна статия. Всеки който се занимава с бази данни ще се сблъска с хеширането, но в повечето книги само се среща този термин. Материала е написан съвсем разбираемо, хубавото е, че е подкрепен и с примери. Успех!

  paro777 на 18.04.2006 19:51

 

 
  • Интересно от Софтуер
 



IT-PLACE.NET © 2004 - 2008