Хэш "foo bar" и "bar foo" с одинаковым значением, верно?Реализуйте его таким образом, чтобы значение ascii и его положение в строке использовались для вычисления хэша, я наивно полагаю, что это значительно уменьшит коллизию.
int hash(char* s)
{
int hash = 0;
int pos = 0;
while(*s)
{
pos++;
hash += (*s * pos);
s++;
}
return hash;
}
Попробуйте и посмотрите, поможет ли это.У меня нет много теоретических знаний за этот ответ.
РЕДАКТИРОВАТЬ * как упомянуто ниже, вы, вероятно, захотите, чтобы хеш был беззнаковым целым.Я проверил это на codechef.com, вот источник и результаты:
#include <stdio.h>
unsigned int hash(char* s);
unsigned int hash2(char* s);
int main(void) {
unsigned int temp1 = hash("foo bar");
unsigned int temp2 = hash("bar foo");
printf("temp1 is %d and temp2 is %d\n",temp1, temp2);
temp1 = hash2("foo bar");
temp2 = hash2("bar foo");
printf("temp1 is %d and temp2 is %d\n",temp1, temp2);
return 0;
}
unsigned int hash(char* s)
{
unsigned int hash = 0;
while(*s)
{
hash = hash + *s;
s++;
}
return hash;
}
unsigned int hash2(char* s)
{
unsigned int hash = 0;
int pos = 0;
while(*s)
{
pos++;
hash += (*s * pos);
s++;
}
return hash;
}
С выводом:
temp1 равен 665 и temp2 равен 665
temp1 равен 2655и temp2 составляет 2715