В вашей функции хеширования есть некоторые лишние вещи.
char hph[32];
int bk,en;
unsigned long h = 0, g,i=0;
int j=0;
strncpy(hph,(const char*)(he).fing_print,32);
while ( j<32 )
{
h = h + hph[j]++;
Это, по сути, h += hph[j];
.Символ с индексом j
увеличивается, но, поскольку он больше никогда не используется, это никак не влияет на хеш.Возможно, вы хотите прекремнировать это?Но это не сильно изменится.
g = h & 0xFFf00000;
Длина отпечатка пальца (или, по крайней мере, той его части, которую вы используете) составляет максимум 32 символа.Каждый из этих символов меньше 256, поэтому общая сумма меньше 32*256 = 8192 = 0x2000
, следовательно, h & 0xFFF00000
равно 0. Таким образом, следующие две строки ничего не делают для h
.
h ^= g >> 24;
h &= ~g;
j++;
}
bk=h%buckets;
en=h%entries_per_bk;
Таким образом, ваш хэш - это сумма первых 32 символов отпечатка пальца.Это плохо распределяет ваши хэши, похожие строки генерируют подобные хэши.Вы получили бы лучший хеш, умножив хеш на простое простое число,
h = 0;
for(j = 0; j < 32; ++j)
h = prime*h + hph[j];
, чтобы небольшие различия по любому индексу (кроме последнего, но вы могли бы умножить еще раз, чтобы распределить их тоже)создавать большие различия хеша.