В настоящее время я работаю с хэш-функцией как таковой:
unsigned long hashFunc(const char *str, unsigned int tablesize ) // djb2 hash
{
unsigned long hash = 5381;
int c;
while (c = *str++)
hash = ((hash << 5) + hash)+ c; /* hash * 33 + c */
return (hash & tablesize)-1;
}
Очевидно, что побитовый оператор & не выполняется для некоторых длинных значений и возвращает вместо него максимальное значение long. Например, хэширование слова "забота" с размером таблицы 63 возвращает 0xffffffff.
Разве побитовые операторы не предназначены для длинных целых чисел без знака? Если да, какие еще есть варианты?