У меня были очень хорошие результаты с этим, но реализация c
SDBM
этот алгоритм был создан для библиотеки базы данных sdbm (переопределение общедоступного домена ndbm). было обнаружено, что он хорошо справляется со скремблированием битов, что приводит к лучшему распределению ключей и меньшему количеству разбиений. это также бывает хорошая общая функция хеширования с хорошим распределением. фактическая функция это hash (i) = hash (i - 1) * 65599 + str [i]; ниже включена более быстрая версия, используемая в gawk. [существует даже более быстрая версия устройства для маффа] магическая константа 65599 была выбрана из воздуха при экспериментировании с разными константами и оказывается простой. это один из алгоритмов, используемых в Беркли БД (см. Sleycat) и в других местах.
static unsigned long
sdbm(str)
unsigned char *str;
{
unsigned long hash = 0;
int c;
while (c = *str++)
hash = c + (hash << 6) + (hash << 16) - hash;
return hash;
}
Чтобы перенести его на vb, расчет идет примерно так.
В основном он проходит по символам строки слева направо, вычисляя хеш как
newHash = the character (c) + (previousHashValue * 2^6) +
(previousHashValue * 2^16) -
previousHashValue**
previousHashValue = newHash