Вот довольно разумная хеш-функция от 4 целых до 1 целого:
unsigned int hash = in[0];
hash *= 37;
hash += in[1];
hash *= 37;
hash += in[2];
hash *= 37;
hash += in[3];
При равномерно распределенном входе он дает равномерно распределенный выход. Все биты ввода участвуют в выводе, и каждое входное значение (хотя не каждый входной бит) может влиять на каждый выходной бит. Скорее всего, это быстрее, чем функция, которая производит вывод, в этом случае производительность не имеет значения.
Существуют и другие хэши с другими характеристиками, но накопление с умножением на простое число - хорошее начало, пока не доказано обратное. Вы можете попробовать накопить с помощью xor вместо сложения, если хотите. В любом случае, легко генерировать коллизии (например, {1, 0, a, b} сталкивается с {0, 37, a, b} для всех a, b), поэтому вы можете выбрать простое число, которое, по вашему мнению, имеет не имеет ничего общего с какой-либо вероятной ошибкой реализации в вашей функции. Так что если в вашей функции много арифметики по модулю 37, возможно, вместо нее используйте 1000003.