Ваше пространство клавиш велико (примерно 2 ^ (8 * 15)), поэтому, если вы хотите получить идеальный хеш, вам нужно заранее знать, какие 489720 реальных клавиш будут отображаться. Даже в этом случае практически невозможно найти идеальный хеш для этих ключей, даже если вы допустили намного большую таблицу (например, очень низкий коэффициент загрузки). Единственный известный мне способ найти идеальный хэш - методом проб и ошибок, и случайный хэш, скорее всего, потерпит неудачу, если в вашей таблице не будет около 489720 ^ 2 записей.
Я настоятельно рекомендую использовать обычный (неидеальный) хеш и , чтобы правильно обрабатывать столкновения , например. с цепочкой:
struct entry {
unsigned char *key;
int value;
struct entry *next;
} *table[1<<20];
int lookup(unsigned char *key) {
int index = hash(key) % (1<<20);
for (struct entry *e = table[index]; e != NULL; e = e->next) {
if (!strcmp(key, e->key)) return e->value;
}
// not found
}
Я также рекомендую вам не реализовывать это самостоятельно - используйте стандартную библиотеку, такую как c ++ hashmap .