|
Алгоритми за хеширане
Изборът на "правилен" алгоритъм за хеширане е много отговорна задача от която до голяма степен зависи ефективността на програмите. Пример от практиката: Парсерът на FASM (flatassembler) използва хеш функция с дължина 32бита за бързо търсене в списъка с етикети по време на компилацията. При първата реализация (до версия 1.51 - ако си спомням добре) се използваше директно търсене в списъка с етикети, като се сравняваха хеш стойностите. При компилиране на големи сорсове с много етикети, бързодействието бързо започваше да пада и по същество времето за компилация зависеше от квадрата на броя редове в програмата. Когато тези ефекти се появиха (при появяването на достатъчно големи програми, написани на FASM), Томаш Гриштар (автора на FASM), смени алгоритъма за търсене с описаният по-горе алгоритъм с двоично хеш дърво. Това увеличи скоростта на парсера 4 до 5 пъти. Следващата стъпка беше наистина впечатляваща: След замяна на предишната хеш функция в компилатора с нова (по алгоритъма <A HREF="http://www.isthe.com/chongo/tech/comp/fnv/" TARGET="_blank" class="grau_normal">FNV-1a</A>), скоростта на парсера се увеличи <b>25 пъти</b> на някои тестове. От този момент, работата на парсера стана толкова бърза, че при всички практически случаи съставлява малка част от цялото време на компилацията. Можете да погледнете цялата дискусия свързана с тази история тук: <A HREF="http://board.flatassembler.net/viewtopic.php?t=854" TARGET="_blank" class="grau_normal">Дискусия за промените във FASM 1.51 (en)</A> Ето и като пример, сорса на алгоритъма FNV-1a, използван във <A HREF="http://flatassembler.net" TARGET="_blank" class="grau_normal">FASM (flatassembler)</A>, а също и в <A HREF="http://fresh.flatassembler.net" TARGET="_blank" class="grau_normal">проекта Fresh</A>: CODE
Кода е без обяснения, защото всъщност алгоритмите за хеширане не могат да се обясняват. Просто се сканира стринга и със ASCII кода на всеки символ се правят някакви сложни аритметични или логически дествия, с цел да се направи изходното число да бъде по възможност зависимо от всички входни символи. Често се използват ротация и умножения на прости числа и т.п. Всеки алгоритъм си е сам за себе си...
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||









