|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Oleg Khrulev 2:5020/175.2 02 Jul 2003 17:16:42 To : Alexey V. Skoufyin Subject : Хэш функция -------------------------------------------------------------------------------- Wed Jul 02 2003 15:58, Alexey V. Skoufyin wrote to All: AVS> From: "Alexey V. Skoufyin" <skuf@cps.tver.ru> AVS> Hарод! Подскажите хэш-функцию для строк (длина строки не более 100 AVS> символов), дающую более-менее равномерное распределение ключа в AVS> интервале 0..n-1, n < 1024 ========================================================================== static int IdentLength; static unsigned int HashValue; // maxHashTable // ------------ // Максимальное значение хэша ( а также размер хэш-таблицы ) // Здесь просто берешь любое простое число меньше 1024 const int maxHashTable = ... const int maxHashTable2 = 1; // Identifier // ---------- // Массив для текущего идентификатора или служебного слова. const unsigned int sizeArrIdentifier=100; static char Identifier[ sizeArrIdentifier ]; static char* CurrIdent; // текущий указатель в этом массиве // static void Hash ( char*& Source ) // ---- // Функция вычисляет два значения: хэш-значение и длину // идентификатора и присваивает их глобальным переменным. // Параллельно функция копирует идентификатор в гобальный // буфер. // Символы берет прямо из исходного текста. // Заметим, что функция модифицирует указатель Source. // Перед выходом функции Source указывает на первый символ // за идентификатором. void Hash(char*& Source) { const int MachWord=32; // Константа для хэш const int HashMask=0xf0000000; unsigned long g,key; char S; IdentLength=0; CurrIdent=Identifier; for(key=0; S=*Source,isalnum(S)||S=='_'; IdentLength++,Source++) { key=(key<<4)+S; if ((g=key&HashMask)!=0) { key=key^(key>>(MachWord-8)); key=key^g; } *CurrIdent++=S; } HashValue=key%maxHashTable; *CurrIdent='\0'; } ========================================================================== Oleg --- ifmail v.2.15dev5 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/3300c0b6ce8c.html, оценка из 5, голосов 10
|